中国象棋将帅问题

中国象棋将帅问题

在中国象棋里将和帅是不能碰面的,如下图所示,当将位于d10时,帅就不能在d1,、d2、d3。请写一个程序,输出将、帅所有的合法位置。

要求在代码中仅用一个字节存储变量。

1

方法一: 使用bit级的运算将数据从一byte变量的左边和右边分别存入和读出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//这个值是记忆存储单元长度的一半
#define HALF_BITS_LENGTH 4
//这个数字表示一个全部bit的mask,在二进制表示中,它是11111111
#define FULLMASK 255
//这个宏表示左bits的mask,在二进制表示中,它是11110000
#define LMASK (FULLMASK << HALF_BITS_LENGTH)
//这个宏表示右bits的mask,在二进制表示中,它表示00001111
#define RMASK (FULLMASK >> HALF_BITS_LENGTH)
//这个宏,将b的右边设置成n
#define RSET(b, n) (b = ((LMASK & b) ^ n))
//这个宏,将b的左边设置为n
#define LSET(b, n) (b = ((RMASK & b) ^ (n << HALF_BITS_LENGTH)))
//这个宏得到b的右边的值
#define RGET(b) (RMASK & b)
//z这个宏得到b左边的值
#define LGET(b) ((LMASK & b) >> HALF_BITS_LENGTH)
//这个数字表示将帅移动范围的行宽度
#define GRIDW 3

#include <stdio.h>

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));
}
}
}
getchar();
}

方法二:

1
2
3
4
5
6
7
BYTE i = 81;
while(i--)
{
if(i / 9 % 3 == i % 9 % 3)
continue;
printf("A = %d, B = %d\n", i/9+1, i%9+1);
}

方法三:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct{
unsigned char a:4;
unsigned char b:4;
}

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)
printf("A = %d, B = %d\n", i.a, i.b);
}
}
Donate? comment?