搜尋入門練習題5 八皇后問題 題解

2022-08-19 22:06:11 字數 1352 閱讀 5588

題目描述

輸出格式

輸出乙個整數,用於表示八皇后問題的放置方案。

題目分析

首先我們用 \((x,y)\) 來表示棋盤上第 \(x\) 行第 \(y\) 列的格仔的座標。

那麼,兩個皇后 \((x_1,y_1)\) 和 \((x_2,y_2)\) 會互相攻擊當且僅當滿足如下條件之一:

我們可以用深度優先搜尋來解決這道題。

我們可以發現的是,要想在 \(8 \times 8\) 的棋盤上放置 \(8\) 個皇后,每一行都必須且只能放置乙個皇后,所以我開乙個陣列ansans[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 ...