#include<stdio.h>
#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))
printf("A = %d, B = %d\n", LGET(b), RGET(b));
return 0;
}
程序大致框架:
遍历A的位置
遍历B的位置
判断将、帅的位置组合是否满足要求。
如果满足则输出。
将帅只能在九个格子中移动,所以我们分析
题目只要求用一个变量,那么这个变量需要储存帅、将两个子的位置信息
bool类型只有false和true;
一个8位的byte类型能够表达2^8=256个值:
因此我们用前四位表示将的位置,后四位表示帅的位置
4个bit位可以表达16个数,绰绰有余。