演算法複習二 八皇后問題 回溯

2021-08-26 21:25:54 字數 1643 閱讀 9594

一,問題描述

在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

二,分析

採用逐步試探的方式,先從乙個方向往前走,能進則進,不能進則退並嘗試另外的路徑。首先我們來分析一下西洋棋的規則,這些規則能夠限制我們的前進,也就是我們前進途中的障礙物。乙個皇后q(x,y)能被滿足以下條件的皇后q(row,col)吃掉

1)x=row(縱向不能有兩個皇后)

2) y=col(橫向不能有兩個皇后)

3)col + row = y+x;(斜向正方向)

4)col - row = y-x;(斜向反方向)

遇到上述問題之一的時候,說明我們已經遇到了障礙,不能繼續向前了。我們需要退回來,嘗試其他路徑。

我們將棋盤看作是乙個8*8的陣列,這樣可以使用一種蠻幹的思路去解決這個問題,這樣我們就是在8*8=64個格仔中取出8個的組合,c(64,8) = 4426165368,顯然這個數非常大,在蠻幹的基礎上我們可以增加回溯,從第0列開始,我們逐列進行,從第0行到第7行找到乙個不受任何已經現有皇后攻擊的位置。

前面四列的擺放如上圖則 第五列,我們會發現找不到皇后的安全位置

第五列的時候,擺放任何行都會受到上圖所示已經存在的皇后的攻擊,這時候我們認為我們撞了南牆了,是回頭的時候了,我們後退一列,將原來擺放在第四列的皇后

(3,4)拿走,從(3,4)這個位置開始,我們在第四列中尋找下乙個安全位置為(7,4),再繼續到第五列,發現第五列仍然沒有安全位置,回溯到第四列,此時第四列也是乙個死胡同了,我們再回溯到第三列,這樣前進幾步,回退一步,最終直到在第8列上找到乙個安全位置(成功)或者第一列已經是死胡同,但是第8列仍然沒有找到安全位置為止

總結一下,用回溯的方法解決8皇后問題的步驟為:

1>從第一列開始,為皇后找到安全位置,然後跳到下一列

2>如果在第n列出現死胡同,如果該列為第一列,棋局失敗,否則後退到上一列,在進行回溯

3>如果在第8列上找到了安全位置,則棋局成功。

三,原始碼(精選自網友解答)

回溯法非遞迴

#includeusing namespace std;

#define n 8

//n代表皇后數

void queen()

{ int count=0; //計算總共的解的數量

int column[n+1]; //column[m]=n 表示第m列,第n行放置了皇后,這裡下表並從0開始

int row[n+1]; //row[m]=1表示第m行沒有皇后,=0表示有皇后

int b[2*n+1]; //b[m]=1表示第m條主對角線沒有皇后,

int c[2*n+1]; //c[m]=1表示第m條次對角線沒有皇后,=0表示有皇后

int numqueen=1; //計數已經放置的皇后數目,當numqueen=n時候則表示已經完成探測

int good=1; //good=1表示沒有發生衝突,good=0表示發生衝突

//初始化這些標記

for(int j=0;j

更牛解答

回溯 皇后 演算法筆記 回溯演算法 N皇后問題

n 皇后問題研究的是如何將 n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。上圖為 8 皇后問題的一種解法。給定乙個整數 n,返回所有不同的 n 皇后問題的解決方案。每一種解法包含乙個明確的 n 皇后問題的棋子放置方案,該方案中 q 和 分別代表了皇后和空位。示例 輸入 4 輸出...

回溯演算法n皇后問題

這是一道考查應聘者綜合能力的問題,其中包含了演算法的設計 ui的設計 介面的設計等問題,當然在具體面試中沒有時間讓應聘者完成整個設計和編碼,但是面試官往往通過了解應聘者的設計思路和工作步驟來考查應聘者的能力。本節將具體分析這道程式設計題。所涉及到的知識點 回溯演算法 net桌面應用程式的ui設計 分...

八皇后問題(回溯演算法)

八皇后問題是古老的問題,十八世紀由乙個西洋棋手提出的,即在乙個8 8 的西洋棋盤上,放置八個皇后,使它們不能相互攻擊到。即不能處於同一行,同一列,也不能處於同一條斜線上,問有多少種擺法。八皇后問題是經典的回溯演算法問題,後人利用計算機,算出了8 8 的棋盤上能擺出92種,而後又提出了n皇后問題。本人...