您的位置:首页 > 其它

HDU 2553 N皇后问题

2016-07-17 11:47 302 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553

N皇后问题

[align=left]Problem Description[/align]
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

你的任务是,对于给定的N,求出有多少种合法的放置方法。

[align=left]Input[/align]
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

[align=left]Output[/align]
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

[align=left]Sample Input[/align]

1
8
5
0


[align=left][/align]
[align=left]Sample Output[/align]

1
92
10


分析:题目意思就是在某一行的某一列放置一个皇后,然后在他的同一行,同一列以及45°对角线都不能放置皇后,求存在多少种放置方案。所以的话,我的思路就是用从第一行开始遍历,用一个数组id[i]表示第i行的皇后放置在哪一列。由于我是按行遍历的,因此在考虑当前行当前列是否可以放置的时候,只需要考虑是否同一列或者在45°对角线上,同一列的问题,可以考虑cur行之前的放置情况,用id[cur]与id[i]来判断,cur表示当前行;对角线的问题,很容易可以发现,判断它们斜率的绝对值是否等于1(紫书上也有一种判断方法,菜鸟没看懂,只能用自己的方法来判断),如果可以放置,则进行cur+1行的操作,直到n-1行,否则考虑另一列。判断一套方案是否成立的条件是cur==n。下面代码用了预处理的方法~
下面上代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int id[12];
int n;
int count1;
int a[12];
void dfs(int cur,int t)
{
if(cur==t)
{
a[t]++;
}
else
{
for(int i=0;i<t;i++)
{
id[cur]=i;
int flag=1;
for(int j=0;j<cur;j++)
{
if(id[cur]==id[j]||abs(cur-j)==abs(id[cur]-id[j]))
{
flag=0;
break;
}
}
if(flag==1)
dfs(cur+1,t);
}
}
}
int main()
{
memset(a,0,sizeof(a));
for(int i=1;i<=10;i++)
{
dfs(0,i);
}
while(~scanf("%d",&n)&&n)
{
printf("%d\n",a
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DFS HDU