#include<bits/stdc++.h>
using namespace std;
int n,cnt;
bool vis[3][50];
void dfs(int x)
{
if(x==n)//x代表当前的行数
{
cnt++;
return ;
}
for(int i=1;i<=n;i++)//代表列
{
if(!vis[0][i]&&!vis[1][x+i]&&!vis[2][x+n-i])
{
//分别是判断列,副对角线,主对角线会不会冲突
vis[0][i]=vis[1][x+i]=vis[2][x+n-i]=1;
dfs(x+1);
vis[0][i]=vis[1][x+i]=vis[2][x+n-i]=0;
}
}
}
int main()
{
int ans[11];
for(int i=1;i<=10;i++)
{
memset(vis,0,sizeof(vis));
cnt=0;
n=i;
dfs(0);
ans[i]=cnt;
}
while(scanf("%d",&n)&&n)
{
cout<<ans[n]<<endl;
}
}
N皇后问题
最新推荐文章于 2022-05-29 19:54:49 发布