您的位置:首页 > 其它

杭电--2553 N皇后问题

2017-04-15 21:50 302 查看
本题链接:点击打开链接

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 22817    Accepted Submission(s): 10157


[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]Sample Output[/align]

1
92
10

 

[align=left]Author[/align]
cgf
 

[align=left]Source[/align]
2008 HZNU Programming Contest

 

[align=left]Recommend[/align]
lcy   |   We have carefully selected several similar problems for you:  2614 1258 1045 1426 1035 
 

解题思路:题意就不说了,大家都懂,这里我和大家再提一下经典的八皇后问题,很多参考书上都有,上面说了所有符合条件的放置方法,都恰好满足每行每列各放置一个皇后。这里我们用 a[x] 表示第 x 行皇后的位置(也就是其列编号)。但为了节省时间,我们还是选择打表的方法。

 

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int a[11];          //第i个皇后放在第i行的第a[i]位
int c[11]={0};          //存放10以内满足条件的次数
int m,n,s;
bool ok(int x)
{
for(int i=1; i<x; i++)
if(a[x]==a[i] || abs(a[x]-a[i])==x-i)  //列和对角线不能重复
return 0;
return 1;

}
void dfs(int x)
{
if(x==m+1)
s++;
for(int i=1; i<=m; i++)
{
a[x]=i;
if(ok(x))
dfs(x+1);
}
}
int main()
{
for(int i=1; i<11; i++)     //本题这样做必须打表,不然会超时。
{
m=i;
s=0;
dfs(1);
c[i]=s;
}
while(~scanf("%d",&n)&&n)
{
printf("%d\n",c
);
}
return 0;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 杭电 DFS 深度搜索