題目
在 n × n 的棋盤中,放置 n 個皇后,使他們互不攻擊(攻擊範圍為同行、同列、同對角線)。
請問有幾種放置方法?
解法
- 每行每列恰好各放一個皇后,因此我們可以逐行放。
- 使用 put[x] 表示:第 x 列的皇后放在第 y 行。
- 判斷同對角線:斜率為 ±1,即 |a−c| == |b−d| 。(一個在 (a, b) 另一個在 (c, d))
程式碼
#include <stdio.h>
#include <stdlib.h> // abs()
#define n 8
int put[n], ans = 0;
void solve(int x) {
if (x == n) {
// 已放完 n 列的皇后,代表這組解 ok
ans++;
return;
}
// 嘗試將皇后放在第 y 行
for (int y = 0; y < n; y++) {
int safe = 1;
// 檢查是否與前面放置的皇后衝突
for (int i = 0; i < x; i++) {
// 同行 or 同對角線
if (put[i] == y || abs(i - x) == abs(put[i] - y)) {
safe = 0;
break;
}
}
if (safe) {
put[x] = y;
solve(x + 1); // 繼續放下一列
}
}
}
int main() {
solve(0); // 從第 0 列開始放
printf("%d", ans);
}最後更新日期:2025 年 3 月 29 日