HDU2553,N皇后问题
程序员文章站
2022-05-20 19:06:09
...
经典的n皇后问题,当n较小的时候用深搜做
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年08月28日 星期二 14时40分15秒
> Description:HDU2553,N皇后问题
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int used[15];
int n;
int ans[15];
int the_ans;
bool check(int layer, int val)//检查在第layer层,第val个位置放置是否可以
{
for (int i=0; i<layer; i++)//检查该竖排
if (used[i]==val)
return false;
for (int i=0; i<layer; i++)//检查45°对角线是否有
{
if (abs(val-used[i])==abs(layer-i))
return false;
}
return true;
}
void dfs(int layer)
{
if (layer==n)
{
the_ans++;
return;
}
for (int i=0; i<n; i++)
{
if (check(layer,i))
{
used[layer]=i;
dfs(layer+1);
}
}
}
int main()
{
for (int i=1; i<=10; i++)
{
n=i;
the_ans=0;
dfs(0);
ans[i]=the_ans;//先用ans数组讲答案存储起来
}
int m;
while (~scanf("%d",&m)&&m)
{
printf("%d\n",ans[m]);
}
return 0;
}