dfs一直往下搜索,每次chack一下是否满足要求,即可
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=30;
int vis[maxn];//记录每行点的纵坐标
int a[20];
int ans;
int n,m;
bool chack(int a,int b)
{
for(int i=1;i<a;i++)
{
if(vis[i]==b||abs(a-i)==abs(vis[i]-b))//判断与该行之前的点的纵坐标是否相等和45度角
return 0;
}
return 1;
}
void dfs(int x,int y)
{
if(x>m)
{
ans++;
return;
}
for(int i=1;i<=m;i++)
{
if(chack(x,i))
{
vis[x]=i;
dfs(x+1,1);
}
}
}
int main()
{
for(int i=1;i<=10;i++)
{
m=i;
ans=0;
dfs(1,1);
// printf("ans : %d\n",ans);
a[i]=ans;
}
while(scanf("%d",&n)!=EOF)
{
if(!n)
break;
printf("%d\n",a[n]);
}
return 0;
}