编程之美 1.2中国象棋将帅问题
问题:
现在有一个象棋残局,只剩下将A帅B,AB只能在3x3的格子里横纵移动,而且AB不能照面。
输出A、B的合法位置(要求代码中只使用一个变量)。
问题本身很简单,难度在于只用一个变量。
解法一:
位向量法,利用一个8位byte存储A、B的位置,利用宏抽象出对byte的操作(& | >> <<)
①对L段赋值 ②对R段赋值 ③从byte中提取L、R的值
解法二:
纯算术操作,这方法看起来太混乱,不好解释。
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); }
解法三:
利用结构体位域,其实跟解法一类似,不过代码清晰明了
#include <stdio.h> struct { unsigned char a:4; unsigned char b:4; }i; int main() { 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); } } } return 0; }