首先八皇后問題相信大家多多少少都有所了解,畢竟是比較經典的回溯搜尋問題了。八皇后的規定是每一枚皇后的行列以及左斜線,右斜線上僅此只能存在乙個。和西洋棋中的皇后規則一樣。如圖:
畫x的是不能放置皇后的
如果我們用搜尋來做的話我們可以搜尋行,然後通過列舉列來判斷是否能放,這裡最大的難點是找到左斜線以及右斜線的規律,可以看到
左斜線的座標分別為(1,1),(2,2)(3,3)(4,4)(5,5)(6,6)觀察會發現行座標-縱座標都為0,由此我們可推斷左斜線規律應該判斷行座標 - 列座標.但是因為是相減有可能為負數,有可能
右斜線的座標分別為(1,5),(2,4),(3,3)(4,2)(5,1)可觀察出每個座標都為行座標加列座標。
這樣就可以判斷皇后的行,列,左斜,右斜是否衝突即可。
搜尋的出口當然是行超過輸入的n那麼就找到一組可行解了,我們設定變數total就是可以擺放皇后的方案。小於等於3我們將其輸出,在輸出之前設定乙個ans陣列儲存列的座標即可。
#include
#include
using
namespace std;
bool vis1[
1005
],vis2[
1005
],vis3[
1005];
//vis1表示列是否能放,vis2表示左斜線是否能放,vis3表示右斜線是否能放
int ans[
1000005];
int n,total;
void
dfs(
int x)
printf
("\n");
}}for(
int i =
1; i <= n; i++)}
}int
main()
八皇后問題 (遞迴 搜尋
八皇后問題 要在西洋棋棋盤8 8中放八個皇后,使任意兩個皇后都不能互相吃 分析 每一列,每一行,每乙個對角線只能放乙個皇后,判斷對角線是否能放的條件是兩個皇后橫縱座標的和或者是差不能相等,若相等,則在乙個對角線,不能放置,每放乙個皇后,都要占領他所在的行,列,對角線 如下 include inclu...
八皇后 搜尋
檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 4 6 1...
搜尋入門練習題5 八皇后問題 題解
題目描述 輸出格式 輸出乙個整數,用於表示八皇后問題的放置方案。題目分析 首先我們用 x,y 來表示棋盤上第 x 行第 y 列的格仔的座標。那麼,兩個皇后 x 1,y 1 和 x 2,y 2 會互相攻擊當且僅當滿足如下條件之一 我們可以用深度優先搜尋來解決這道題。我們可以發現的是,要想在 8 tim...