(演算法)N皇后問題

2021-09-07 01:27:11 字數 1082 閱讀 1347

八皇后問題:在8 x 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。

1、回溯法

資料結構:

由於8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列a[8],陣列中第i個數字,即a[i]表示位於第i行的皇后的列號。

滿足條件:任意兩個皇后不同列,即a[i]!=a[j],任意兩個皇后不在同一對角線上,即abs(i-j)!=abs(a[i]-a[j])。

演算法:回溯法,通過深度遍歷的形式列舉陣列a的所有排列組合,並通過剪枝的形式(判斷是否滿足上述的條件)來減少不必要的計算量,詳見**。

2、全排列法

思路與字串排列一樣只是還需要對每一種排列做判斷。

資料結構:

8個皇后不能處在同一行,那麼肯定每個皇后佔據一行,這樣可以定義乙個陣列a[8],陣列中第i個數字,即a[i]表示位於第i行的皇后的列號,先把陣列a[8]分別用0-7初始化。

滿足條件:由於我們用0-7這7個不同的數字初始化陣列,因此任意兩個皇后肯定也不同列,那麼我們只需要判斷每個排列對應的8個皇后中是否有任意兩個在同一對角線上即可,即對於陣列的兩個下標i和j,如果i-j==a[i]-a[j]或i-j==a[j]-a[i],則認為有兩個元素位於了同乙個對角線上,則該排列不符合條件。

思路:參考字串排列:

求整個字串的排列,可以分成兩步:首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面的所有字元交換;然後固定第乙個字元,求後面所有字元的排序。此時仍把後面的字元看成兩部分,第乙個字元和後面的字元,然後重複上述步驟。(遞迴)

然後判斷每一種排列是否滿足上述新增即可。

1、回溯法

#include #include #include using namespace std;

int count=0;

bool canplace(int index,const vector&result)

void queen_permutation(vector&result,int index,int len)

演算法 n皇后問題

題目描述 乙個 n n 的棋盤,要在上面放 n 個皇后。規則 兩個皇后之間如果是同列 同行 同對角線它們會互相攻擊。也就 是 說 棋盤上的任意兩個皇后不能為同列 同行 同對角線。演算法思想 q j 表示乙個解的空間即儲存一組可行解的陣列,j表示行數,q j 的值表示j行可以放置皇后的所在列數,根據任...

演算法 n皇后問題

解題思路 這是一道非常經典的dfs問題,只需要從頭依次列舉各個情況即可。這樣設計dfs方式,先依次列舉每一行,在每一行中,再列舉當前行的每乙個元素,每次列舉完一行,就繼續向下一行列舉。根據題目規則,設計列舉過程的衝突陣列,防止皇后之間相互攻擊。而衝突陣列需要進行回溯。下面的 中,只有列 和兩個斜向衝...

演算法 N皇后問題

n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 輸入 4 輸出...