C 基於回溯法解決八皇后問題示例

2022-10-04 00:33:11 字數 1465 閱讀 5795

回溯法的基本做法是搜尋,或是一種組織得井井有條的,能避免不必要搜尋的窮舉式搜尋法。這種方法適用於解一些組合數相當大的問題。

回溯法在問題的解空間樹中,按深度優先策略,從根結點出發搜尋解空間樹。演算法搜尋至解空間樹的任意一點時,先判斷該結點是否包含問題的解。如果肯定不包含,則跳過對該結點為根的子樹的搜尋,逐層向其祖先結點回溯;否則,進入該子樹,繼續按深度優先策略搜尋。

回溯法指導思想——走不通,就掉頭。設計過程:確定問題的解空間;確定結點的擴充套件規則;搜尋。

n皇后問題

要在n*n的西洋棋棋盤中放n個皇后,使任意兩個皇后都不能互相吃掉。規則:皇后能吃掉同一行、同一列、同一對角線的任意棋子。求所有的解。n=8是就是著名的八皇后問題了。

設八個皇后為xi,分別在第i行(i=1,2,3,4……,8);

問題的解狀態:可以用(1,x1),(2,x2),……,(8,x8)表示8個皇后的位置;

由於行號固定,可簡單記為:(x1,x2,x3,x4,x5,x6,x7,x8);

問題的解空間:(x1,x2,x3,x4,x5,x6,x7,x8),1≤xi≤8(i=1,2,3,4……,8),共88個狀態;

約束條件:八個(1,x1),(2,x2) ,(3,x3),(4,x4) ,(5,x5), (6,x6) , (7,x7), (8,x8)不在同一行、同一列和同一對角線上。

盲目的列舉演算法:通過8重迴圈模擬搜尋空間中的88個狀態,從中找出滿足約束條件的「答案狀態」。程式如下:

/**作者:侯凱

*說明:八皇后——盲目迭代法

*日期:2013-12-18

*/#include

using namespace std;

bool check_1(int a,int n) }}

return true;//不衝突

}void queens_1()}}

}}

} }cout<

程式思想比較簡單,最後可知共92種擺放方法。如果能夠排除那些沒有前途的狀態,會節約時間——回溯法(走不通,就回頭)。

bool check_2 (int a[ ],int n)

return true;

}void queens_2()

if(a[k]<=n)//找到了合理的位置

{ if(k==n )

{//找到一組解

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

{cout<

這樣也可以得到,8皇后程式設計客棧問題的92中結果。更簡單、可讀的方法是採用遞迴的方式,如下:

int a[100], n, count;

void backtrack(int k)

{ if (k>n)//找到解

{ for(int i=1;i<=8;i++)

{ cout<

可見,遞迴呼叫大大減少了**量,也增加了程式的可讀性。給出其中的乙個解,如下:

本文標題: c++基於回溯法解決八皇后問題示例

本文位址:

回溯法解決八皇后問題

在西洋棋棋盤上 8 8 放置八個皇后,使得任意兩個皇后之間不能在同一行,同一列,也不能位於同於對角線上。問共有多少種不同的方法,並且指出各種不同的放法。使用回溯法依次假設皇后的位置,當第乙個皇后確定後,尋找下一行的皇后位置,當滿足左上 右上和正上方向無皇后,即矩陣中對應位置都為0,則可以確定皇后位置...

演算法 回溯法解決八皇后問題

八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。八皇后問題 author dustdawn date 2019 8...

八皇后問題(回溯法)

問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...