本题是经典的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; }