【C/C++】八皇后問題

題目

在 n × n 的棋盤中,放置 n 個皇后,使他們互不攻擊(攻擊範圍為同行、同列、同對角線)。
請問有幾種放置方法?

解法

  1. 每行每列恰好各放一個皇后,因此我們可以逐行放。
  2. 使用 put[x] 表示:第 x 列的皇后放在第 y 行。
  3. 判斷同對角線:斜率為 ±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 日

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *