P1219 [USACO1.5]八皇后 Checker Challenge
代码是参照郭炜老师的代码写的,不过一直87无法通过,后来知道因为算法纯递归调用过于朴素,要开o2优化,对于代码的理解可以参考下面的注释(我写的),如果还不理解,可以去看郭炜老师的课
#include <bits/stdc++.h>
using namespace std;
int N;
int queenPos[20];//存放k个皇后的位置
void NQueen(int k);
int n=0;
int main()
{
ios::sync_with_stdio(0);
cin>>N;
NQueen(0);
cout<<n<<endl;
return 0;
}
void NQueen(int k)
{
int i;
if(k==N)//如果k个皇后全部放好,直接输出
{
n++;
if(n<=3)//按照题目要求的输出
{
for(i=0; i<N; i++)
{
cout<<queenPos[i]+1<<" ";
}
cout<<endl;
}
return;
}
for(i=0; i<N; i++)//寻找第K行皇后的位置
{
int j;
for(j=0; j<k; j++)//对于前面已经放好位置的k-1行皇后
{
if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j))//如果列号冲突或者斜向冲突
break;
}
if(j==k)//没有冲突
{
queenPos[k]=i;//将第K个的皇后放在第i行
NQueen(k+1);
}
}
}