码迷,mamicode.com
首页 > 其他好文 > 详细

1.2中国象棋将帅问题

时间:2014-09-28 00:45:30      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:style   color   使用   ar   for   sp   问题   on   c   

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

直觉上我们想到,只要遍历将帅所有可能的位置,去除将帅冲突的位置即可。可见,剩下的问题就在于如何使用一个变量来做二重循环的遍历。书中解法一给出的方法是将一个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的变化则相当于内层的变化。





1.2中国象棋将帅问题

标签:style   color   使用   ar   for   sp   问题   on   c   

原文地址:http://blog.csdn.net/u010470972/article/details/39613679

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!