https://www.luogu.com.cn/problem/P1219?contestId=67264https://www.luogu.com.cn/problem/P1219?contestId=67264从左下到右上的列,横纵坐标相加总是相等。
从左上到右下的列,横坐标-纵坐标+n总是相等
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[1010],d1[1010],d2[1010],col[1010],sum;
void dfs(int index)
{
if(index==n+1)
{
sum++;
if(sum<=3)
{
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return ;
}
for(int i=1;i<=n;i++)
{
if(col[i]==0&&d1[index+i]==0&&d2[index-i+n]==0)
{
col[i]=1;
d1[i+index]=1;//从左下到右上
d2[index-i+n]=1;//从左上到右下
a[index]=i;
dfs(index+1);
a[index]=0;
col[i]=0;
d1[index+i]=0;
d2[index-i+n]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<sum<<endl;
}