本題是經典的n皇后問題,使用回溯法求解。第一次用一個for循環檢測當前位置是否和前面的皇后衝突,結果在最後一個測試例輸入13時,超時0.436s,後改用二維數組直接判斷,輸入13時僅用時0.562秒,再一次顯示學會利用空間換時間的重要性。ios
/* ID:jzzlee1 PROG:checker LANG:C++ */ #include<iostream> #include<fstream> #include<cmath> #include<cstring> using namespace std; ifstream fin("checker.in"); ofstream fout("checker.out"); int n,ans,k,c[15],vis[30][30]; void search(int cur) { int i; if(cur==n) //遞歸邊界,若是走到這裏,全部皇后必然不衝突 { ans++; if(k<3) //打印前三組 { //cout<<c[0]+1; fout<<c[0]+1; for(int i=1;i!=n;i++) fout<<" "<<c[i]+1; //cout<<" "<<c[i]+1; fout<<endl; //cout<<endl; k++; } } else for(i=0;i<n;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])//直接利用二維數組判斷 { c[cur]=i; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; //修改全局變量 search(cur+1); vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; //將全局變量的值改回來 } } } int main() { //cin>>n; fin>>n; memset(c,0,sizeof(c)); search(0); fout<<ans<<endl; //cout<<ans<<endl; return 0; }