杭电--2553 N皇后问题
2017-04-15 21:50
302 查看
本题链接:点击打开链接
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 行皇后的位置(也就是其列编号)。但为了节省时间,我们还是选择打表的方法。
代码:
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; }
相关文章推荐
- 杭电2553 N皇后问题(普通方法和位运算两种方法)
- 【杭电】[2553]N皇后问题
- 杭电 2553 N皇后问题
- 杭电 HOJ 2553 N皇后问题 解题报告
- N皇后问题 HDU 杭电2553【递归回溯】
- 杭电 2553 N皇后问题
- 杭电 2553 N皇后问题
- 杭电 2553 N皇后问题 递归回溯 打表 附解题思路
- 杭电 2553 N皇后问题
- 杭电 acm 2553 N皇后问题
- 杭电2553之n皇后问题
- 杭电-2553 N皇后问题 (经典深搜)
- 杭电2553 N皇后问题
- 杭电2553--N皇后问题(回溯)
- HDOJ 2553 N皇后问题 杭电 ACM
- HDU-2553-N皇后问题
- HDU 2553 N皇后问题 深搜
- HDOJ 2553 N皇后问题
- hdu 2553 N皇后问题<java>
- hdu 2553 N皇后问题(深度递归搜索)