為了簡化,先對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個皇后在棋盤中的位置.第二步 定 ...