编程之美中国象棋将帅问题,书中解法二代码如下:
#include <cstdio>
typedef unsigned char BYTE;
int main()
{
BYTE i = 81;
while(i--)
{
if (i/9%3 == i%9%3)
continue;
printf("A = %d, B = %d\n", i/9+1, i%9+1);
}
return 0;
}
我觉得书上这么写不便于理解,所以稍微修改了一下:
#include <cstdio>
typedef unsigned char BYTE;
int main()
{
BYTE i = 0;
while (i++ < 81)
{
if (i/9%3 != i%9%3)
{
printf("A = %d, B = %d\n",i/9+1, i%9 +1 );
}
}
return 0;
}
变量i的变化范围是闭区间[0, 80],总共81个数,分成9组,每组9个数。第1组[0, 8], 第2组[9, 17],...第9组[72, 80]。第1组中的任意一个数执行i/9等于0,但是i%9则可以取[0, 8]中的每一个数;第2组i/9等于1,i%9同样可以取[0, 8]中的每一个数,其他组情况类似。
现在我们以第1组来分析,令k=i/9; j=i%9;显然第1组的k始终为0,而j则从0以步长1递增到8,是不是感觉有点像下面这样的代码,当k取0时候的情形:
for (int k =0; k <= 8; k ++)
{
for (int j = 0; j <=8; j ++)
{
//do something
}
}
第2组、第3组、...、第9组,依次对应k取1、2、...、8的情形。
所以这里的i/9相当于上面双重循环的第1层循环,i%9相当于第2层循环。
不知道这么写是不是好理解一些~