我是个学生更是只菜鸟,我是怀着拜读之心翻开的这本书,即将走上IT岗位的我不敢怠慢。中国象棋将帅问题的笔记和心得如下:
问题描述:
中国象棋,棋盘上只有“将”和“帅”,按照中国象棋中两者不能照面的规则,输出两者所有的合法位置组合,要求在代码中只能使用一个变量。
将象棋里两个老大分别可以走的9个位置编号如下:
1 2 3
4 5 6
7 8 9
分析与解法:
采用互斥条件列举出所有的可能性;
由于本题只能使用一个变量来存储两个老大的位置信息,那么我们采用一个8位的byte类型可以表示2^8=256个值。这里我们都知道一个8位byte类型表示的范围是:-128~127 也就是 -2^7~2^7-1即:1000,0000~0111,1111的二进制表示。
然后在引入相关的掩码运算比如设置操作。全1的掩码相与保留原值,全0清楚为0,还要熟悉相关的移位运算。
最后,两者的位置编号模3运算结果不等则是合法的位置组合,将其输出即可,否则是不合法的。这样的过程用2层嵌套的循环即可。
其他:
书中的解法三采用结构体来解决一个变量遍历二重循环的问题,思想上换汤不换药。真正有趣的是解法二,它的代码如下:
int var = 81;
while( var-- )
{
if( var / 9 % 3 == var % 9 % 3 )//发生冲突
continue;
else
printf();
}
心得:
很显然,“/”与“%”是用一个变量值进行内外层循环的常用伎俩。我们要明白i/9和i%9的含义。我们知道,整数i可以由部两分组成,即var=(var/9)*9+var%9 ,其中var<n。我们注意到,在i从81到0变化的过程中,var%9的变化相当于内层循环,var/9的变话相对于内层循环。这样,作者就妙地用一个变量i同时获得了两个变量的数值。