N皇后问题 |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 723 Accepted Submission(s): 419 |
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
|
#include<bits/stdc++.h> #define maxn 15 using namespace std; int low[15],res[15]; int lmid[15],rmid[15];//左斜线和右斜线都是从上往下数的 int n; int cur; void dfs(int x) { if(x==n) { cur++; return ; } for(int i=x;i<n;i++) { if(low[i])continue; for(int j=0;j<n;j++) { if(res[j]||lmid[i+n-1-j]||rmid[i+n-(n-j)]) continue; low[i]=1; res[j]=1; lmid[i+n-1-j]=1; rmid[i+n-(n-j)]=1; dfs(x+1); low[i]=0; res[j]=0; lmid[i+n-1-j]=0; rmid[i+n-(n-j)]=0; } } } int main() { for(n=1;n<=10;n++) { memset(low,0,sizeof low); memset(res,0,sizeof res); memset(lmid,0,sizeof lmid); memset(rmid,0,sizeof rmid); cur=0; dfs(0); cout<<"n="<<n<<" "<<cur<<endl; } } /* 附带打表大法,打表大法好啊! #include <iostream> #include<stdio.h> using namespace std; int n,x[11]={0,1,0,0,2,10,4,40,92,352,724}; int main() { while(~scanf("%d",&n)&&n) printf("%d ",x[n]); return 0; }*/