编程之美-1.2-中国象棋将帅问题

问题描述:
模拟中国象棋规则,将、帅分别占据一个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;
			}
		}
	}
    原文作者:Cqy_Chaos
    原文地址: https://blog.csdn.net/cqysmyg_1/article/details/83344208
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞