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

《编程之美》中国象棋将帅问题

时间:2014-11-30 12:36:04      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   os   for   on   2014   问题   log   

问题描述

中国象棋里面双方的“将”和“帅”各自呆在自己的九宫格里,一步只能横移或纵移一格,而且双方不能见面(既不能处在同一条纵线上)。在残局时有的人会用这一规则走出绝妙杀招。假设一方的“将”为A,另一方的“帅”为B,现在求双方所能出现的所有合法位置,所需变量只能用一个字节来保存。

我的解法

#include <stdio.h>
int main(void)
{
	unsigned char chPos = 0x11;
	for ( ; (chPos & 0x0f) <= 9 ; chPos += 0x01) {
		for ( ; (chPos >> 4) <= 9 ; chPos += 0x10) {
			if (((chPos & 0x0f) - 1) % 3 == (((chPos >> 4) - 1) % 3)) 
				continue;
			printf ("B = (%c , %d) A = (%c , %d)\n" ,
					'd' + ((chPos & 0x0f) - 1) % 3 , 1 + ((chPos & 0x0f) - 1) / 3 ,
					'd' + ((chPos >> 4) - 1) % 3   , 8 + ((chPos >> 4) - 1 ) / 3 );			
		}
		chPos &= 0x0F;
		chPos |= 0x10 ;
	}
	return 0;
}

只要一个字节,将帅只能在9个点移动,所以前四个位表示将、后四位表示帅的位置(1~9),那么余3是列号,除3是行号,只要保证列号不同即可。

《编程之美》中国象棋将帅问题

标签:blog   io   ar   os   for   on   2014   问题   log   

原文地址:http://blog.csdn.net/u012458164/article/details/41621239

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