中国象棋之将帅不在同一直线上

1、问题描述:

下过中国象棋的小伙伴们都知道,双方的“将”和“帅”相隔遥远,且不能照面。很多路边残局摆摊的高手们,经常

用这一规则走出精妙的杀招。 “将”和“帅”所能移动的范围为3*3的方格内,为了简化我们只给出“将”和“帅”移动的范围图,象棋的其它位置没有给出:

问题来了:写一个程序,找出“将”和“帅”的所有合法位置,要求在代码中只能使用一个字节存储变量

2、结题思路

其实问题本身并不复杂,我们可以遍历“将”和“帅”的所有位置,并将互斥的情况列出来即可。问题的难点在于只

能使用一个字节,我们知道 “将”和“帅”的位置只能有3*3=9种,使用4个bit就可以保存所有情况的位置,因此我们用一个字节的地4位保存“将”的位置,高四位保存“帅”的位置。又如何判断合法的位置呢?我们观察数据可知,1、4、7对3取余数都为1,2、5、8对3取余数都为2,3、6、9对3取余数都为0,也就是说如果“将”的位置mod 3 != “帅”的位置mod 3 ,则位置就是合法的。

3、代码实现

#include <iostream>

using namespace std;

struct chess 
{
	unsigned char a : 4;
	unsigned char b : 4;
};

int main()
{
	chess x;
	for (x.a = 1; x.a <= 9;x.a++)
	{
		for (x.b = 1; x.b <= 9;x.b++)
		{
			if (x.a % 3 != x.b % 3)
				cout << "(" << (int)x.a << "," << (int)x.b << ") ";
		}
		cout << endl;
	}
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值