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

来源:互联网 发布:淘宝信用度怎么看 编辑:程序博客网 时间:2024/06/05 04:09

解法1: 主要运用了 位运算,很巧妙;


#include <stdio.h>#include<windows.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 3int main(){    unsigned char b = 0;    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));        }    }    system("pause");    return 0;}


解法2:解法技巧性很高

int i = 81;while(i--){    if(i/9%3 == i%9%3)        continue;    printf("A = %d,B = %d\n",i/9+1,i%9+1);}



解法3:

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