8皇后問題 回溯法

2021-06-20 23:12:49 字數 1357 閱讀 4619

為了簡化,先對4皇后問題進行討論,對與4皇后問題,先定義乙個4x4的棋盤(矩陣),按照下面規則將4個棋子(皇后)放到棋盤上。

規定:

1、任何兩個棋子不同行

2、任何兩個棋子不同列

3、任何兩個棋子不在用一對角線上

先引入一副圖來說明:

(該圖為嚴版教材上的)

對與此問題,剛開始的時候棋盤為空,回溯法的思想是:從該樹形結構圖的根節點開始,進行先序遍歷,到葉子結點時就得到了結果,並輸出。在次過程中如果能繼續前進則進,否則就退回來,換一條路徑。

值得說明的是:這個樹形結構圖是我們抽象出來的。

就個人而言,此問題可以以行或列為單位,例如就先以行說明,將第一棋子放在第一行,第二個棋子放在第二行.........將最後乙個棋子放在最後一行,這樣就避免了棋子同行。對與列也可以能有相似的結果。

對與此問題的偽**:

void trial1(int i,int n)//採用2維陣列存放棋盤,i從第0行開始變化

}

// 具體**實現如下:

#include#includeusing namespace std;

const int n =4;//定義問題規模:4皇后問題

char arr[n][n];//定義棋盤大小

void print(char str[n][n])

{ cout<=0;row--,col--) //左上

if(arr[row][col] == '*')

return false;

for(row=i+1,col=j+1;row=0;row++,col--) //左下

if(arr[row][col] == '*')

return false;

for(row=i-1,col=j+1;row>=0 && col

輸出結果如下圖:

這樣就利用回溯法實現了4皇后問題,當然對於8皇后的問題,只要在設定棋盤的大小時,將n設定為8,此問題就是8皇后問題了!

8皇后回溯法

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

回溯法求解8皇后問題

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

回溯法之二 8皇后問題

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯1850年提出 在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上.問題分析 第一步 定義問題的解空間 這個問題解空間就是8個皇后在棋盤中的位置.第二步 定 ...