HDU 2553 N皇后问题(DFS)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5171 Accepted Submission(s): 2357
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
Author
cgf
Source
Recommend
lcy
搜索水题。。。。不过这题得打表,如果每次都搜索的话会超时。。。
By LFENG
#include<stdio.h>
int s[12] = {0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724}; int main() { int n; while(scanf("%d", &n) != EOF && n) printf("%d\n", s[n]); return 0; } |
By LFENG
#include<stdio.h>
#include<string.h> #include<stdlib.h> int n, sum; int g[12], ti[12]; int check(int cur) { int i; for(i = 0; i < cur; i++) if(abs(cur - i) == abs(g[cur] - g[i]) || g[i] == g[cur])return 0; return 1; } void dfs(int cur) { int i, next; if(cur == n) { sum++; return ; } for(i = 0; i < n; i++) { g[cur] = i; if(!check(cur))continue; dfs(cur + 1); } } int main() { int num; for(n = 1; n <= 10; n++) { memset(g, 0, sizeof(g)); sum = 0; dfs(0); ti[n] = sum; } while(scanf("%d", &num) != EOF && num) printf("%d\n", ti[num]); return 0; } |