编程之美-1.2-中国象棋将帅问题
问题描述:
模拟中国象棋规则,将、帅分别占据一个3x3的位置空间,用1~9分别表示每个位置。输出所有将、帅位置不同列的解。
书中给出了三种解法。
第一种:利用unsigned char类型变量的高四位、低四位分别表示将、帅的位置信息(unsigned char类型变量占据一个字节,可以表达0~255的数。)。LSET(b, 1)、RSET(b, 1)可以将b的高低四位分别初始化为0001。之后执行递增操作。
#include using namespace std;#define HALF_BITS_LENGTH 4
#define FULLMASK 255
#define LMASK (FULLMASK << HALF_BITS_LENGTH)
#define RMASK (FULLMASK >> HALF_BITS_LENGTH)
#define RSET(b, n) (b = ((LMASK & b) ^ n))
#define LSET(b, n) (b = ((RMASK & b) ^ (n << HALF_BITS_LENGTH)))
#define RGET(b) (RMASK & b)
#define LGET(b) ((LMASK & b) >> HALF_BITS_LENGTH)
#define GRIDW 3int main()
{unsigned char b;for (LSET(b, 1); LGET(b) <= GRIDW * GRIDW; LSET(b, (LGET(b) + 1))){for (RSET(b, 1); RGET(b) <= GRIDW * GRIDW; RSET(b, (RGET(b) + 1))){if (LGET(b) % GRIDW != RGET(b) % GRIDW){cout << "A = " << LGET(b) << ", B = " << RGET(b) << endl;}}}return 0;
}
第二种:从i = 9 x 9 = 81开始,进行递减,遍历所有情况。
BYTE i = 81;
while (i--)
{if (i / 9 % 3 != i % 9 % 3){cout << "A = " << i / 9 + 1 << ", B = " << i % 9 + 1 << endl;}
}
第三种:利用结构体,定义两个成员,分别表示将、帅的位置信息。
struct
{unsigned char a : 4;unsigned char b : 4;
} i;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){cout << "A = " << (int)i.a << ", B = " << (int)i.b << endl;}}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
