编程之美:中国象棋将帅问题解法二

编程之美中国象棋将帅问题,书中解法二代码如下:
#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层循环。

不知道这么写是不是好理解一些~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值