问题描述:
模拟中国象棋规则,将、帅分别占据一个3×3的位置空间,用1~9分别表示每个位置。输出所有将、帅位置不同列的解。
书中给出了三种解法。
第一种:利用unsigned char类型变量的高四位、低四位分别表示将、帅的位置信息(unsigned char类型变量占据一个字节,可以表达0~255的数。)。LSET(b, 1)、RSET(b, 1)可以将b的高低四位分别初始化为0001。之后执行递增操作。
#include <iostream>
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 3
int 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;
}
}
}