資料結構之圖論之深度搜索之八皇后
阿新 • • 發佈:2018-12-10
//八皇后問題 #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> using namespace std; int a[100],count,n; bool check(int a[],int k) { for(int i=1;i<k;i++) if((abs(a[k]-a[i])==k-i)||(a[k]==a[i])) return false; return true; } void dfs(int k) { if(k>n){ for(int i=1;i<9;i++) cout<<a[i]<<""; count++; cout<<endl; }else{ for(int i=1;i<=8;i++){ a[k]=i; if(check(a,k)) dfs(k+1); } } } int main() { n=8;count=0; dfs(1); cout<<count<<endl; return 0; }
dfs大法好!
來梳理一下DFS的思路:
1、建立一個數組:存放要列印的方案。
2、建立dfs遞迴:判斷遞迴結束條件
for迴圈遍歷一下,看看是否可以進行深層遞迴(一般結合狀態函式)
回溯
再來梳理一下本題思路:
1;由於本題的特殊性:一維陣列存放方案(a[ 5 ]=2表示在第六行第二列存放)
2;判斷遞迴結束條件(本題的結束條件比較複雜,所以不選擇使用狀態陣列,而使用一個函式來判斷)
3;關於回溯的問題,好好看一下程式碼,會清楚的。