今天試著寫八皇后問題,結果因為邏輯錯誤卡超久= =
今天寫的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;
}
沒有留言:
張貼留言