2011年11月11日 星期五

八皇后問題

今天試著寫八皇后問題,結果因為邏輯錯誤卡超久= =

今天寫的code超醜,演算法筆記上的code好簡潔,改天再來修一下程式碼


#include <stdio.h>
#include <stdbool.h>

int count = 0;
bool map[8][8] = {false};

// 八個方向
int dir[8][2] = {
    {0, -1}, {0, 1}, {-1, 0}, {1, 0},
    {-1, -1}, {-1, 1}, {1, 1}, {1, -1}

};
void queen(int x, int y, int n)
{
    int i, j, k;
    bool valid;

    valid = true;
    for (k = 0; valid && k < 8; k++)
        for (i = x + dir[k][0], j = y + dir[k][1];
             i >= 0 && i < 8 && j >= 0 && j < 8;
             i += dir[k][0], j += dir[k][1])
        {
            if (map[i][j])
            {
                valid = false;
                break;
            }
        }

    // 如果確實可以放在此點,就將map[x][y]標記
    if (valid)
    {
        map[x][y] = true;
        // 避免越界
        if (x+1 < 8)
            queen(x+1, 0, n+1);
        if (n+1 == 8)
        {
            count++;
            /*for (i = 0; i < 8; i++)
            {
                for (j = 0; j < 8; j++)
                    if (map[i][j])
                        printf("Q ");
                    else
                        printf("- ");
                printf("\n");
            }
            printf("__________\n");*/
        }
        // 取消標記
        map[x][y] = false;
    }

    // 不放皇后在此點的情況
    if (y+1 >= 8)  // 避免越界
    {
        if (x+1 < 8)
            queen(x+1, 0, n);
    }
    else
        queen(x, y+1, n);

}

int main(void)
{
    queen(0, 0, 0);
    printf("有%d組解\n", count);  // 輸出有幾組解

    return 0;
}

沒有留言:

張貼留言