/* ……N皇后的摆放问题……
一开始没有打表,所以一直TLE,之后参考了别人的代码才反应过来可以打表,
只要掌握了递归搜索再加上皇后摆放的控制条件就ok了。
下面附上AC代码:
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int temp,p,q[11];
void slove(int n)
{
if(n==p+1) //所有皇后已经摆放好,退出递归
{
temp++;
return ;
}
else
{
for(int i=1;i<=p;i++)
{
q[n]=i;
int flag=1;
for(int j=1;j<n;j++)
{
if(i==q[j] || n+i== j+q[j] || n-i== j-q[j]) // 注:1、i=q[n] 2、不在同一条斜线的两点的含义是行标到对角线的的距离不相等
{
flag=0;
break; //此位置不符合皇后摆放条件
}
}
if(flag)
slove(n+1);
}
}
}
int main()
{
int cnt[11],m; //数据不大,打表
for(p=1;p<=10;p++)
{
temp=0;
slove(1); //从第一个皇后开始摆放
cnt[p]=temp;
}
while(~scanf("%d",&m),m)
{
printf("%d\n",cnt[m]);
}
return 0;
}
HDU 2553 N皇后问题(递归搜索)
最新推荐文章于 2021-12-01 17:22:18 发布