演算法內功修煉 全排列實現八皇后回溯法優化(二)

2021-08-26 02:59:03 字數 853 閱讀 4010

3、全排列實現八皇后回溯法優化

樸素演算法——暴力法

通過列舉所有情況,然後判斷每一種情況是否合法的做法是非常樸素的;因此,我們把這種不使用優化,直接用樸素演算法來解決問題的做法叫做暴力法。

回溯法

經過思考可以發現,當已經放置了一部分皇后時(程式執行到一定時),可能剩餘的皇后無論如何放置都無法滿足結果,此時就沒必要往下遞迴了,直接返回上一層即可,這樣就可以為程式減少很多計算量。

在這種情況下,遞迴函式將不再遞迴呼叫,而是返回上一層呼叫,這種現象稱為回溯。

下面是使用回溯的寫法實現八皇后:

#include#includeusing namespace std;

const int maxn = 11;

int n, p[maxn], hashtable[maxn] = ;

void generatep(int index,int &count)

cout <> n;

int count=0;

generatep(1,count);

cout 執行結果:

4—皇后

8—皇后

共92組解。

演算法內功修煉 全排列與實現八皇后(一)

內容 全排列實現 結合全排列實現八皇后 全排列實現八皇后回溯法優化 八皇后中對角線判斷問題 1 全排列實現 輸出乙個1 n的全排列。如 1到3,123,132,213,231,312,321 演算法描述 includeusing namespace std const int maxn 11 int...

八皇后 全排列 C語言

問題描述 在乙個8 8的西洋棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列和同一斜線上,問有多少種擺法。思路 因為每行 每列都只能有乙個皇后,因此可以按照行來看,對每行皇后所在的列做乙個標記。每個後可以按照行來看,那麼每個列數可以看作乙個全排列。上圖所表示的全排列為 6...

八皇后問題 之全排列解法

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