【NOJ1007】【演算法實驗二】【回溯演算法】八皇后問題
阿新 • • 發佈:2018-12-12
1007.8皇后問題
時限:1000ms 記憶體限制:10000K 總時限:3000ms
描述
輸出8皇后問題所有結果。
輸入
沒有輸入。
輸出
每個結果第一行是No n:的形式,n表示輸出的是第幾個結果;
下面8行,每行8個字元,‘A’表示皇后,‘.’表示空格。
不同的結果中,先輸出第一個皇后位置靠前的結果;第一個皇后位置相同,先輸出第二個皇后位置靠前的結果;依次類推。
輸出樣例
輸出的前幾行: No 1: A....... ....A... .......A .....A.. ..A..... ......A. .A...... ...A....
#include <iostream> #include <cmath> using namespace std; int n=8; //求解8皇后問題 int a[8]; //存放解,a[0]=1代表第0行第1列放置皇后 int cnt=0; //解的個數 void dfs(int m); //回溯深搜 bool canmoveto(int m); //第m行第a[m]列能否放皇后? void fprint(int cnt); //列印一組解 int main() { dfs(0); return 0; } void dfs(int m) //進行第m行的放置工作 { if(m==n){ //全部8行已放置完畢 cnt++; fprint(cnt); } else{ for(a[m]=1;a[m]<=8;a[m]++){ //分別測試放置在m行各列能否成功 if(canmoveto(m)){ dfs(m+1); } } } } //函式功能:判斷第m行第a[m]列能否放皇后 bool canmoveto(int m) { int i; for(i=0;i<m;i++){ if(a[i]==a[m]) //同列檢測 return false; if(abs(i-m)==abs(a[i]-a[m])) //同斜線檢測 return false; } return true; } //函式功能:列印一組解 void fprint(int cnt) { int i,j; cout<<"No "<<cnt<<':'<<endl; for(i=0;i<n;i++){ for(j=1;j<=n;j++){ if(a[i]==j) cout<<'A'; else cout<<'.'; } cout<<endl; } }