引子问题:
中国象棋将帅问题:
在一把象棋的残局中,象棋双方的将帅不可以相见,即不可以在中间没有其他棋子的情况下在同一列出现。而将、帅各被限制在己方的3*3的格子中运动。相信大家都非常熟悉象棋的玩法吧,这里就不详细说明游戏规则了。 用A、B代表将和帅,请写出一个程序,输出A、B所有合法的位置。要求在代码中只能用一个变量。
分析与解法: 这个问题的解法并不复杂。 遍历A的所有位置 遍历B的所有位置 如果A的位置和B的位置在同一列 输出结果 否则 继续寻找 地图可以用0-8表示A或B可能的9个位置 0——1——2 3——4——5 6——7——8
关键问题在于只使用一个变量来表示A和B的位置。所以可以使用位运算来解决。
位运算确实是一个思路,可以节省空间,在很多时候,我们想表达的变量可能就是只有一个很小的范围,我们大可不必用一个int或char去表示。
但是这里想关注的不是位运算,而是下面一种解法:
int var = 81;
while( var-- )
{
if( var / 9 % 3 == var % 9 % 3 )//发生冲突
continue;
else
printf(/** 打印可行的位置 **/);
}
开始看的一下也是没看明白,后来才发现,一个常数c,可以表示成c=c/9*9+%9,所以实际上上面代码的var/9就可以当成内层循环,而var%9就可以当成外层循环,因为var的最大值是81,所以循环的范围就在0~8之间进行,然后我们在打印的时候就只需要在额外加上1即可。确实很巧妙。