題目描述
輸出格式
輸出乙個整數,用於表示八皇后問題的放置方案。
題目分析
首先我們用 \((x,y)\) 來表示棋盤上第 \(x\) 行第 \(y\) 列的格仔的座標。
那麼,兩個皇后 \((x_1,y_1)\) 和 \((x_2,y_2)\) 會互相攻擊當且僅當滿足如下條件之一:
我們可以用深度優先搜尋來解決這道題。
我們可以發現的是,要想在 \(8 \times 8\) 的棋盤上放置 \(8\) 個皇后,每一行都必須且只能放置乙個皇后,所以我開乙個陣列ans
,ans[id]
用於表示在第id
行放置的皇后的列號。
然後我開乙個函式f(id)
,用於表示:當前正準備在第id
行放置乙個皇后。然後我從 \(1\) 到 \(8\) 去遍歷列號 \(i\) ,如果 \((id,i)\) 能放,則我嘗試性地在 \((id,i)\) 位置放上皇后,然後遞迴呼叫f(id+1)
, 直到id>8
(說明找到了一種放置方案)為止。
那麼,我怎麼去判斷 \((id,i)\) 這個位置能否放置乙個皇后呢?我們搜尋的順序是從第 \(1\) 行一直到第 \(8\) 行的,所以當我要放置第 \(id\) 行的皇后的時候,肯定已經在第 \(1\) 到 \(id-1\) 行放置好了前 \(id-1\) 個皇后。所以我只需要從 \(1\) 到 \(id-1\) 去遍歷行號 \(j\) ,比較一下第 \(j\) 行放置的皇后 \((j,ans[j])\) 和我現在想要放的皇后 \((id,i)\) 是否會相會攻擊即可。
如果這 \(id-1\) 個皇后都和 \((id,i)\) 位置沒有衝突,則說明 \((id,i)\) 這個位置是可以放的,那我嘗試性地在 \((id,i)\) 位置放上皇后,並遞迴地進行下一步搜尋f(id+1)
。
實現**如下:
#include using namespace std;
int ans[9], cnt; // ans[i]用於記錄第i行皇后列號,cnt用於記錄方案數
// attack函式用於判斷(x1,y1)和(x2,y2)兩個點是否會互相攻擊
// 返回true:會互相攻擊到;返回false:不會互相攻擊到
bool attack(int x1, int y1, int x2, int y2)
// f函式用於在第id行嘗試性地放乙個i,然後遞迴地去id+1行放
void f(int id)
for (int i = 1; i <= 8; i ++)
}if (flag)
}}int main()
搜尋入門練習題10 八皇后問題輸出方案 題解
題目出處 資訊學奧賽一本通 第五章上機練習2 題目描述 輸入格式 無輸入。輸出格式 按給定順序和格式輸出所有八皇后問題的解 見樣例輸出 樣例輸入 無輸入。樣例輸出no.1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 ...
搜尋練習題(1)八皇后
檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 4 6 1...
C語言練習題 八皇后問題
c和指標 練習題8.8 參考至 問題描述 皇后是西洋棋中威力最大的棋子。在下面所示的棋盤上,皇后可以攻擊位於箭頭所覆蓋位置的所有棋子。我們能不能把n個皇后放在棋盤 n n 上,它們中的任何乙個都無法攻擊其餘的皇后?請編寫程式輸出皇后的擺放方案,並找出一共有幾種方法。char board n 2 n ...