內容:
全排列實現
結合全排列實現八皇后
全排列實現八皇后回溯法優化
八皇后中對角線判斷問題
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.接下來八皇后相互攻擊的問題...