题目链接: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,求出有多少种合法的放置方法。
Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input 1 8 5 0
Sample Output 1 92 10
Author cgf
Source
2008 HZNU Programming Contest
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 ; } |