八皇后問題(回溯)

2021-08-28 10:41:41 字數 1553 閱讀 1889

時限:1000ms 記憶體限制:10000k  總時限:3000ms

描述輸出8皇后問題所有結果。

輸入沒有輸入。

輸出每個結果第一行是no n:的形式,n表示輸出的是第幾個結果;下面8行,每行8個字元,『a』表示皇后,『.』表示空格。不同的結果中,先輸出第乙個皇后位置靠前的結果;第乙個皇后位置相同,先輸出第二個皇后位置靠前的結果;依次類推。

輸入樣例

輸出樣例

輸出的前幾行:

no 1:

a.......

....a...

.......a

.....a..

..a.....

......a.

.a......

...a....

no 2:

a.......

.....a..

.......a

..a.....

......a.

...a....

.a......

....a...

程式如下:

#include #include using namespace std;

int a[8]=;

int sum=0;

void print()

{ int i,j;

cout<<"no "《演算法是逐行安排皇后的,其引數m為現在正執行到第幾行。8是皇后數.

第2行好理解,如果程式當前能正常執行到第8行,那自然是找到了一種解法,於是八皇后問題解法數加1。

如果當前還沒排到第八行,則進入else語句。遍歷所有列col,將當前col儲存在陣列a裡,然後使用canplace()檢查row行col列能不能擺皇后,若能擺皇后,則遞迴呼叫search去安排下一列擺皇后的問題。

還不太清楚?再慢點來,剛開始的時候row=0,意思是要對第0行擺皇后了。

if判斷失敗,進入else,進入for迴圈,col初始化為0

顯然,0行0列的位置一定可以擺皇后的,因為這是第乙個皇后啊,後宮空蕩她想怎麼折騰就怎麼折騰,於是canplace(0,0)測試成功,遞迴呼叫search(1)安排第1行的皇后問題。

第1行時row=1,進來if依然測試失敗,進入for迴圈,col初始化為0。1行0列顯然是不能擺皇后的,因為0行0列已經有乙個聖母皇太后在那擱著了,於是canplace()測試失敗,迴圈什麼也不做空轉一圈,col變為1。1行1列依然canplace()測試失敗,一直到1行2列,發現可以擺皇后,於是繼續遞迴search(2)去安排第二個皇后位置。

如果在某種情況下問題無解呢?例如前面在4皇后問題中,0行0列擺皇后是無解的。假設前面遞迴到search(2)時候,發現第2行沒有地方可以擺皇后,那怎麼辦呢?要注意search(2)的呼叫是在search(1)的for迴圈框架內的,search(2)若無解,則自然而然search(1)的for迴圈col自加1,即將第1行的皇后從1行2列改為1行3列的位置,檢查可否放皇后後繼續安排下一行的皇后。如此遞迴,當search(0)的col自加到7,說明第一列的皇后已經遍歷了從0行1列到0行7列,此時for迴圈結束,程式退出。

在主函式中呼叫search(0),得到正確結果,8皇后問題一共有92種解法。

回溯 八皇后問題

八皇后問題 國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。分析 八皇后問題是回溯演算法的典型案例。我想我們在自己做的過程中,是這樣的 是先從 0,0 這個座標開始排放皇后,然後 1...

八皇后問題 回溯

在劉汝佳老師的書中對於8皇后問題的分析 我感覺非常經典 8皇后問題可行的解 92個 一共有3種思考的出發點 從64個格仔中選乙個子集,使得 子集中恰好有8個格仔,且任意兩個選出的格仔都不在同一行,同一列或同一對角線上 這正是子集的列舉問題。然而,64個格仔的子集有264個,太大了,這並不是乙個很好的...

八皇后問題(回溯)

八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。可設定乙個陣列a i j,代表第i行第j列放置棋子。先按行從上往下的順序,每遞迴一次,在每一行的某一列放乙個棋...