遞迴 基於排列的八皇后問題解法

2022-05-10 20:42:10 字數 1052 閱讀 4408

以下**劉海濤個人部落格:

題目:在8×

8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角斜線上(並不僅只是最長的兩條對角線)。下圖中的每個黑色格仔表示乙個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。

這就是有名的八皇后問題。解決這個問題通常需要用遞迴,而遞迴對程式設計能力的要求比較高。因此有不少面試官青睞這個題目,用來考察應聘者的分析複雜問題的能力以及程式設計的能力。

由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列

columnindex[8]

,陣列中第

i個數字表示位於第

i行的皇后的列號。先把

columnindex

的八個數字分別用

0-7初始化,接下來我們要做的事情就是對陣列

columnindex

做全排列。由於我們是用不同的數字初始化陣列中的數字,因此任意兩個皇后肯定不同列。我們只需要判斷得到的每乙個排列對應的八個皇后是不是在同一對角斜線上,也就是陣列的兩個下標i和

j,是不是i-j==columnindex[i]-column[j]

或者j-i==columnindex[i]-columnindex[j]

關於排列的詳細討論,詳見本系列部落格的第

28篇,《

字串的排列

》,這裡不再贅述。

接下來就是寫**了。思路想清楚之後,編碼並不是很難的事情。下面是一段參考**:

int

void

void

intint }

else

} }

bool

int }

return

true;

} void

int

但是需要指出的是:該演算法在時間效能上並不佔優勢,其時間複雜度為o(n!*n^2).

八皇后及任意多皇后問題解法之遞迴解法

遞迴解法的基本原理是把乙個大問題拆分成幾個類似的小問題,小問題繼續拆解成更小的問題,直到不能拆解的單元問題為止,再把所有單元問題的解匯集成問題的全部解。就八皇后問題而言,可以先擺第一列,共八種位置選中,每種位置選擇下,剩餘的八行七列中繼續擺放其他皇后,即變成了八個 八行七列棋盤擺七個皇后問題 的解的...

八皇后問題 遞迴求解法

include include include 八皇后問題遞迴方法實現 using namespace std ofstream file 用以計數計算結果的數目 int count 1 列印的棋盤其中列印1的位置是皇后的位置,0空位。這裡因為在控制台看不到全部,所有做了在檔案中輸出所有的解 int...

八皇后問題 之全排列解法

問題的分解一共有兩步 1.生成問題的所有候選解空間 2.過濾掉那些不滿足要求的細化這兩步,需要認識到下面兩點 1.八皇后所有候選解空間是 1,2,3,4,5,6,7,8 這個集合中元素的全排列 這個全排列不僅列出了候選解,並且還自動規避掉了皇后在橫 豎方向上攻擊的問題 2.接下來八皇后相互攻擊的問題...