《编程之美》读书笔记01: 1.2中国象棋将帅问题

《编程之美》读书笔记01: 1.2中国象棋将帅问题

《编程之美》读书笔记011.2中国象棋将帅问题

 

当初,刚看到题时,首先想到的是除法计算除数的商和余数(eaxedx)。后来才想到需要动态多维数组时,new一维数组,用它模拟多维数组时,多维数组的下标和实际偏移量的转换,我想很多人学习CC++时都做过这种事吧。

 

本来以为题目要求输出将帅在棋盘上的具体位置,如d10f1,书中的解法给的是相对位置,解决起来更简单。解法一用了一堆令人讨厌的宏,代码实在不美,解法三和解法一本质是一样的,虽然解法三只定义了一个结构体,但结构体内有两个变量,总共有三个变量,不合题意才对。

 

要将一个变量i拆成两个,可以按其的二进制表示,取出连续几位,比如第0-3位和第4-7位,读变量时,取出变量i相应的几位,存变量时,再更新变量i的对应几位。另外,利用位置的对称性,可以一次输出两个,减少循环次数。

 

下面的代码和解法一类似,但是一次输出两个,减少了循环次数,并且没有用到除法,如果不考虑C++ IO效率的影响,会比解法二和解法三都高效。

 

 


  unsigned i;
  
// 外层循环变量a使用i的第4-7位,初始值为1,最大值为8。
  
// 内层循环变量b使用i的第0-3位,初始值为a+1,最大值为9。
   for  (i = 0x10 ; i < 0x90 ; i += 0x10 )
    
for  (i =  (i & 0xF0 ) | (i >> 4 ); ( ++ i & 0xF ) < 10 ; )
      
if  ( ((i & 0xF ) - (i >> 4 )) != 3   &&  ((i & 0xF ) - (i >> 4 )) != 6 )
        cout
<<   " A= " <<  (i >> 4 ) <<   " , B= " <<  (i & 0xF ) <<   " \n "
            
<<   " A= " <<  (i & 0xF ) <<   " , B= " <<  (i >> 4 ) <<   " \n " ;



你可能感兴趣的:(《编程之美》读书笔记01: 1.2中国象棋将帅问题)