杭电2553 N皇后问题
2015-04-29 14:12
429 查看
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11191 Accepted Submission(s): 4987
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
没打表的话要超时,估计是10种情况反复测试了,所以先打表,避免重复计算。
#include<stdio.h> int hang[300][300]= {0,0}; int lie[30]= {0}; int cnt=0; int ans[30][30]; void solve(int nowhang,int n) { // printf("$$ %d\n",nowhang); if(nowhang==n+1) { cnt++; /* int i,j; for(i = 1; i <= n; ++i) { for(j = 1; j <= n; ++j) { printf("%d\t",ans[i][j]); } puts(""); } puts("===");*/ return ; } int i,j; for(i=1; i<=n; i++) { //lie if(lie[i]==1||hang[nowhang][i]!=0) continue; //列有皇后,或这一个位子是上一行皇后的对角位子 else { // printf("%d %d OK\n",nowhang,i); lie[i]=1; for(j=1; nowhang+j<=n; j++) //nowhang的i列可以填 hang[nowhang+j][i+j]++;//i列nowhang的下一行的左右 for(j=1; nowhang+j<=n&&i-j>0; j++) hang[nowhang+j][i-j]++; ans[nowhang][i] = 1; solve(nowhang+1,n); // printf("%d ",cnt); lie[i]=0; for(j=1; nowhang+j<=n; j++) hang[nowhang+j][i+j]--; for(j=1; nowhang+j<=n&&i-j>0; j++) hang[nowhang+j][i-j]--; ans[nowhang][i] = 0; } } } int main() { // freopen("out.txt","w",stdout); int n; int p; int huang[20]={0}; for(p=1;p<=10;p++) { cnt=0; solve(1,p); huang[p]=cnt; } while(scanf("%d",&n),n!=0) { printf("%d\n",huang[n]); } }
相关文章推荐
- 杭电--2553 N皇后问题
- 杭电 2553 N皇后问题
- 杭电 2553 N皇后问题
- 杭电 2553 N皇后问题
- 杭电2553 N皇后问题(普通方法和位运算两种方法)
- 杭电 2553 N皇后问题 递归回溯 打表 附解题思路
- 杭电2553--N皇后问题(回溯)
- 【杭电】[2553]N皇后问题
- 杭电2553之n皇后问题
- 杭电-2553 N皇后问题 (经典深搜)
- 杭电 acm 2553 N皇后问题
- 杭电 2553 N皇后问题
- N皇后问题 HDU 杭电2553【递归回溯】
- HDOJ 2553 N皇后问题 杭电 ACM
- 杭电 HOJ 2553 N皇后问题 解题报告
- hdu 2553 N皇后问题 (DFS)
- hdu 2553:N皇后问题(DFS遍历,水题)
- HDOJ 题目2553 N皇后问题(dfs)
- HDU 2553 N皇后问题
- 八皇后问题,杭电2553