回溯法之二 8皇后問題

2021-08-22 14:23:27 字數 919 閱讀 3049

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上.

問題分析:

第一步 定義問題的解空間

這個問題解空間就是8個皇后在棋盤中的位置.

第二步 定**空間的結構

可以使用8*8的陣列,但由於任意兩個皇后都不能在同行,我們可以用陣列下標表示

行,陣列的值來表示皇后放的列,故可以簡化為乙個以維陣列x[9]。

第三步 以深度優先的方式搜尋解空間,並在搜尋過程使用剪枝函式來剪枝

根據條件:x[i] == x[k]判斷處於同一列

abs(k-i) == abs(x[k]-x[i]判斷是否處於同一斜線

我們很容易寫出剪枝函式:

bool canplace(int k)

return true;

}

然後我們按照回溯框架一,很容易寫出8皇后的回溯**:

void queen(int i)

for(int j = 1; j <= 8; j++)

}

整個**:

#include

#include

using namespace std;

int x[9];

void print()

bool canplace(int k)

return true;

}void queen(int i)

for(int j = 1; j <= 8; j++)

}int main()

8皇后問題 回溯法

為了簡化,先對4皇后問題進行討論,對與4皇后問題,先定義乙個4x4的棋盤 矩陣 按照下面規則將4個棋子 皇后 放到棋盤上。規定 1 任何兩個棋子不同行 2 任何兩個棋子不同列 3 任何兩個棋子不在用一對角線上 先引入一副圖來說明 該圖為嚴版教材上的 對與此問題,剛開始的時候棋盤為空,回溯法的思想是 ...

8皇后回溯法

思路 逐行放置,逐列搜尋。從當前行的第一列開始搜尋,判斷該位置是否合法。合法則遞迴判斷下一行,不合法則搜尋下一列,直到最後一列也不符合,或者在最後一行放下棋子就返回上一次遞迴,一直到第一行遍歷完畢。include include include define maxsize 8 char a max...

回溯法求解8皇后問題

問題描述 在乙個8 8西洋棋盤上,有8個皇后,每個皇后佔一格 要求皇后間不會出現相互攻擊的現象,即不能有兩個皇后處在同一行 同一列或同一對角線上 問共有多少種不同的擺放方法?本解法採用回溯遞迴法,容易理解,首先在棋盤上擺第乙個皇后,然後擺第二個,每擺乙個皇后則判斷位置是否合法。如果合法,則擺下乙個皇...