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

2021-08-25 22:45:52 字數 1394 閱讀 3944

內容:

全排列實現

結合全排列實現八皇后

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

八皇后中對角線判斷問題

1、全排列實現

輸出乙個1~n的全排列。如:1到3,123,132,213,231,312,321

演算法描述:

#includeusing namespace std;

const int maxn = 11;

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

void generatep(int index)

cout << endl;

return;

} //列舉1~n,預將元素x存入p[index]中

for (int x = 1;x <= n;x++) }}

int main()

執行結果:

2、結合全排列實現八皇后

八皇后問題:

在乙個8*8的棋盤裡,每一行每一列只能存在乙個皇后,否則就會被之前存在的皇后吃掉。皇后可以吃掉同一行同一列以及所在對角線上新加入的皇后。

分析:經過思考,不難發現以下事實:恰好每行每列各放置乙個皇后。如果用p陣列表示第index行皇后的列編號,則問題變成了全排列生成問題。剩下的事情就是排除那些對角線相同的結果。

排除對角線相同:

int count = 0;//記錄滿足八皇后的結果

if (index == n + 1) }}

if (flag) 

count++;

return count;

}

初步**實現:

#include#include#includeusing namespace std;

const int maxn = 11;

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

int generatep(int index,int &count)

}} if (flag)

count++;

return;

} //列舉1~n,預將元素x存入p[index]中

for (int x = 1;x <= n;x++) }}

int main()

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

3 全排列實現八皇后回溯法優化 樸素演算法 暴力法 通過列舉所有情況,然後判斷每一種情況是否合法的做法是非常樸素的 因此,我們把這種不使用優化,直接用樸素演算法來解決問題的做法叫做暴力法。回溯法 經過思考可以發現,當已經放置了一部分皇后時 程式執行到一定時 可能剩餘的皇后無論如何放置都無法滿足結果,...

八皇后 全排列 C語言

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

八皇后問題 之全排列解法

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