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; } }