演算法 遞歸回溯 八皇后問題
/* 八皇后問題: 其實就是在全排列的基礎上加了不能在對角線這個條件,第一個程式碼直接用暴力法判斷這個條件,第二個程式碼用回溯法,回溯法減少了很多計算量 */ #include<iostream> #include<cmath> using namespace std; const int Max=10; int n; int count=0; bool Pos[Max]= {false}; int T[Max]; void generateP(int index) { if(index==n+1) { bool flag=true; for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { if(abs(j-i)==abs(T[i]-T[j]))//相當於在在一個直角三角形中,當該兩者相等時,則角度為45,則為對角線 { flag=false; break; }
} if(flag==false)break ; } if(flag)count++;
return ; }
for(int x=1; x<=n; x++) { if(Pos[x]==false) { Pos[x]=true; T[index]=x; generateP(index+1); Pos[x]=false; } }
}
int main() { cin>>n; generateP(1); cout<<count; return 0; } //第二個改進的程式碼
#include<iostream> #include<cmath> using namespace std; int n; const int Max=10; bool pos[Max]= {false}; int T[Max]; int count=0;
void generateP(int index) { bool flag=true; if(index==n+1)//當程式能走到這一步,證明各項條件都滿足了 { count++; }
for(int x=1; x<=n; x++) { bool flag=true; if(pos[x]==false)//當符合基本條件不同行時 { for(int pre=1;pre<index;pre++)//開始檢驗是否為對角線 { if(abs(T[pre]-x)==abs(pre-index)) { flag=false; break; } }
if(flag) { T[index]=x; pos[x]=true; generateP(index+1); pos[x]=false; } }
} }
int main() { cin>>n; generateP(1); cout<<count; return 0; }
//參考資料 《演算法筆記》