中国象棋将帅问题

来源:互联网 发布:苹果手机打开4g网络 编辑:程序博客网 时间:2024/05/16 04:56

在《编程之美》中,作者给出了三种解法,我的解法与那三种解法相比没有性能优点,唯一的优点在于利用了十六进制的特殊性,使结果打印不需要进行转换,可以直接对应棋盘上的位置。

/* * 棋盘参见《编程之美》1.2节,将帅和将的所有可能出现的位置打印出来 * 要求: 只用一个字节存储变量 * StoryMonster   2016/7/15 */#include <stdio.h>int main(){    //我使用16进制数的字面意思表示实际位置    //0xd1表示第d列第1行,0xfa表示第f列第10行    unsigned char Apos = 0xda;    while(true)    {        while((Apos&0x0f)>=0x08)        {            if((Apos&0xf0) == 0xd0)            {                printf("A:%x B:%x\n",Apos,((Apos+0x10)&0xf0)+1);                printf("A:%x B:%x\n",Apos,((Apos+0x20)&0xf0)+1);                printf("A:%x B:%x\n",Apos,((Apos+0x10)&0xf0)+2);                printf("A:%x B:%x\n",Apos,((Apos+0x20)&0xf0)+2);                printf("A:%x B:%x\n",Apos,((Apos+0x10)&0xf0)+3);                printf("A:%x B:%x\n",Apos,((Apos+0x20)&0xf0)+3);            }            else if((Apos&0xf0) == 0xe0)            {                printf("A:%x B:%x\n",Apos,((Apos+0x10)&0xf0)+1);                printf("A:%x B:%x\n",Apos,((Apos-0x10)&0xf0)+1);                printf("A:%x B:%x\n",Apos,((Apos+0x10)&0xf0)+2);                printf("A:%x B:%x\n",Apos,((Apos-0x10)&0xf0)+2);                printf("A:%x B:%x\n",Apos,((Apos+0x10)&0xf0)+3);                printf("A:%x B:%x\n",Apos,((Apos-0x10)&0xf0)+3);            }            else            {                   printf("A:%x B:%x\n",Apos,((Apos-0x10)&0xf0)+1);                printf("A:%x B:%x\n",Apos,((Apos-0x20)&0xf0)+1);                printf("A:%x B:%x\n",Apos,((Apos-0x10)&0xf0)+2);                printf("A:%x B:%x\n",Apos,((Apos-0x20)&0xf0)+2);                printf("A:%x B:%x\n",Apos,((Apos-0x10)&0xf0)+3);                printf("A:%x B:%x\n",Apos,((Apos-0x20)&0xf0)+3);            }            Apos--;        }        if(Apos == 0xf7) break;        Apos &= 0xf0;        Apos += 0x10;        Apos += 0x0a;    }    return 0;}
0 0
原创粉丝点击