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.接下來八皇后相互攻擊的問題...