链接:https://www.luogu.org/problemnew/show/P1219
思路:回溯,搜索,标记方法;
可以用四个数组判断+标记;
a[i]=j--可以表示第i行第j个; b[j]==1--表示这一行已经有了;
c[i+j]==1--表示从左上到右下的对角线有了;
扫描二维码关注公众号,回复:
2191837 查看本文章
d[i+n-j]==1--表示从右上到左下的对角线有了;
代码:
#include<iostream>
using namespace std;
int a[10010],b[10010],c[10010],d[10010];
int n,s;
void print()
{
int i;
s++;
if(s<=3)
{
for(i=1; i<=n; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
}
int search(int i)
{
int j;
for(j=1; j<=n; j++)
{
if(b[j]==0&&c[j+i]==0&&d[i+n-j]==0)
{
a[i]=j;
b[j]=1;
c[j+i]=1;
d[i+n-j]=1;
if(i==n) print();
else search(i+1);
b[j]=0;c[j+i]=0;d[i+n-j]=0;
}
}
}
int main()
{
cin>>n;
search(1);
cout<<s<<endl;
return 0;
}