程序之美 1.2 象棋问题

来源:互联网 发布:php trim 去除空格 编辑:程序博客网 时间:2024/05/09 05:58

先注:在编程问题中遇到的一些问题:C语言中表示二进制数 采用0x或者0,而不采用显示二进制表示。

所谓象棋问题就是使用避免将帅相遇而进行的一种输出工作。


算法抽象:

两个难点:(1)表示将帅的位置。(2)使用一个变量表示两个位置。


最笨的办法 多个变量解决该问题:

    //for (int i= 0;i < 3;i ++)
    //{
    //    for (int j = 0;j < 3;j++)
    //    {
    //        for (int t = 0;t < 3;t++)
    //        {
    //            if (j == t)
    //            {
    //                for (int k = 0;k < 3;k++)
    //                {
    //                    printf("A:%d,%d,B:%d,%d.\n",i,j,k,(t+1)%3);
    //                    printf("A:%d,%d,B:%d,%d.\n",i,j,k,(t+2)%3);
    //                }

    //            }
    //        }
    //    }
    //}



微软的思路

(1)使用byte变量表示,前四位和后四位分别表示将帅的两个位置。

(2)使用位操作,进行取舍。


其算法为:我的实现


//byte info = 0x00;                            //info的高四位表示将A的位置4位可表示16个状态(我们只是用0-8状态)
    //                                            //info的低四位表示帅B的位置,同上(我们只是用0-8状态)
    //for (;info <= 0x80;info += 0x10)            //循环info 遍历A
    //{
    //    for (;(info&0x0f) <= 0x08;info += 0x01)//循环info 遍历B
    //    {
    //        if ((info >> 4)%3 != (info & 0x0f)%3)//排除列相同元素
    //        {
    //            printf("A:%d,%d,B:%d,%d.\n",(info >> 4)/3,(info >> 4)%3,(info & 0x0f)/3,(info & 0x0f)%3);//输出
    //        }
    //    }
    //    info = info & 0xf0;//重置info的第四位 进行下一次循环
    //}


另一种极为简便的思路为:(算法极为简便)

(1)使用9*9=81表示总的状态

(2)剔除不相关的状态


    byte i = 81;li
    while(i--)
    {
        if (i/9%3 == i%9%3)
            continue;
        printf("A:%d,%d,B:%d,%d.\n",i/9/3,i/9%3,i%9/3,i%9%3);
    }