1.2中国象棋将帅问题

(根据中国象棋的基本原则)在只有双的将帅棋盘上,找出所有双方可以落子的位置(将帅不能碰面),但只能使用一个变量。

直觉上我们想到,只要遍历将帅所有可能的位置,去除将帅冲突的位置即可。可见,剩下的问题就在于如何使用一个变量来做二重循环的遍历。书中解法一给出的方法是将一个Byte变量拆成两个用,前一半代表“帅”可以走的位置,后一个变量代表“将”可以走的位置(事先已经将“将”和“帅”可以走的3*3的位置进行了编号),利用位操作即可获得两个计数器的功能。

书中的解法三采用结构体,C语言中的位域来解决一个变量遍历二重循环的问题,思想上换汤不换药。

真正有趣的是解法二。


(一)

我们先看算法三:

for(i.a = 1; i.a <= 9; ++i.a) {
	for(i.b = 1; i.b <= 9; ++i.b) {
		if(i.a % 3 == i.b % 3)
			printf("A = %d, B = %d\n", i.a, i.b);
	}
}

(二)

下面我们再看最有意思的算法二:

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);
}
在上面的算法中,“/”与“%”是用一个变量值进行内外层循环的常用伎俩。

在i从81变化到0的过程中,i / 9的变化相当于外层循环的变化,而i % 9的变化则相当于内层的变化。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值