洛谷
https://www.luogu.org/problemnew/show/P1219
皇后从第一行开始,向第n行放置,每一行又搜索每一列的位置,检查是否符合要求。
#include<iostream>
#include<cstdio>
using namespace std;
void dfs(int x);
int col[30],v1[30],v2[30],ans=0,n;
int a[30];
int main()
{
scanf("%d",&n);
dfs(1);//从第一行第一个位置开始
printf("%d",ans);
return 0;
}
void dfs(int x) //x行数
{
if(x>n)//x已经遍历完所有的行
{
ans++;
if(ans<=3)
{
for(int j=1;j<=n;j++)
printf("%d ",a[j]);
cout<<endl;
}
}
else
{
for(int i=1;i<=n;i++) //i列数
{
if(!col[i]&&!v1[x-i+13]&&!v2[x+i])//col[i]同一列, v1[x-i+13]同一副对角线, v2[x+i]同一主对角线
{
col[i] = 1;//占领列
v1[x-i+13] = 1; //占领副对角线 (如何判断在同一副对角线,行号-列号的值相同,即为同一副对角线。为防止x-i为负数,故加上一个合适常数,防止数组下标是负数)
v2[x+i] = 1;//占领主对角线 (行号+列号相同,即为同一主对角线)
a[x] = i;//记录当前列
dfs(x+1);
col[i] = 0;
v1[x-i+13] = 0;
v2[x+i] = 0;
}
}
}
}