八皇后問題

2021-08-21 15:20:33 字數 1284 閱讀 1586

八皇后問題是這樣乙個問題:將八個皇后擺在一張8*8的西洋棋棋盤上,使每個皇后都無法吃掉別的皇后,一共有多少種擺法,其中皇后是最強大的一枚棋子,可以吃掉與其在同一行、列和斜線的敵方棋子?

經典解法:回溯法

void queen(int row)        

}

演算法是逐行安排皇后的,其引數row為現在正執行到第幾行。n是皇后數,在八皇后問題裡當然就是8啦。

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

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

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

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

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

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

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

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

#include#includeusing namespace std;

int n=8;

int total=0;

int *c=new int(n);

bool is_ok(int row)

return true;

}void queen(int row)

}int main()

八皇后問題

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

八皇后問題

include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...

八皇后問題

package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...