編程之美-中國象棋將帥問題

廢話不多說,上代碼

代碼

/************************************************************************
    編程之美1.2中國象棋將帥的問題
************************************************************************/

#include <stdio.h>

/************************************************************************
    方法一:使用位域 吊炸天
************************************************************************/
void first()
{
    // 使用位域
    struct  
    {
        unsigned char a:4;
        unsigned char b:4;
    } i;
    for (i.a = 1; i.a < 10; i.a++)
    {
        for (i.b = 1; i.b < 10; i.b++)
        {
            if (i.a % 3 != i.b %3)
            {
                printf("A=%d, B=%d\n", i.a, i.b);
            }
        }
    }
}

/************************************************************************
    方法二:使用位操作
     * 讀左邊4位 b & 0x0f
     * 加一後,存左邊4位 b & 0xf0 | ((b&0x0f)+1)) 
     * 讀右邊4位 (b & 0xf0) >> 4
     * 加一後,存右邊4位 b & 0x0f | (((b&0xf0>>4)+1)<<4)
************************************************************************/
void second()
{
    unsigned char b = 1;
    // 左四位
    for (; (b&0x0f) < 10; b = b+1)
    {
        // 保證每次右四位都是一開始
        b = b & 0x0f | 0x10;
        // 右四位
        for (; ((b&0xf0)>>4) < 10; b = (b & 0x0f | ((((b&0xf0)>>4)+1)<<4)))
        {

            if (((b&0x0f) % 3) != (((b&0xf0)>>4) % 3))
            {
                printf("%d, %d\n", b&0x0f, (b&0xf0)>>4);
            }
        }
    }
}


int main(int argc, char *argv[])
{
    //first();
    second();
    return 0;
}

PS

  • 位域使用很是巧妙
  • 注意運算符的優先級,如果不清楚,使用括號,此題深受其害!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章