HDU-2553

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22760    Accepted Submission(s): 10136


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

 

首先我们要知道 对于向右下45°,所有的位置有行-列相等的特性;对于向左下45°,所有位置有行+列相等的特性。上下就是列相等。

由此,我们可以对这三个方向标记,若都不存在皇后,则该位置可行。

 

注意 本题需要先打表,因为n最大仅为10,打表可以避免对于同样的询问浪费多余的时间。

 

附AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,sum;
 5 int vis[3][50],t[15];
 6 
 7 void dfs(int row){
 8     if(row==n+1){
 9         sum++;
10         return;
11     }
12     for(int i=1;i<=n;i++){
13         if(vis[0][row-i+n]==0&&vis[1][i]==0&&vis[2][row+i]==0){
14             vis[0][row-i+n]=1;
15             vis[1][i]=1;
16             vis[2][row+i]=1;
17             dfs(row+1);
18             vis[0][row-i+n]=0;
19             vis[1][i]=0;
20             vis[2][row+i]=0;
21         }
22     }
23 }
24 
25 int main(){
26     for(n=1;n<=10;n++){
27         memset(vis,0,sizeof(vis));
28         sum=0;
29         dfs(1);
30         t[n]=sum;
31         //cout<<n<<" "<<t[n]<<endl;
32     }
33     while(cin>>n&&n){
34         cout<<t[n]<<endl;
35     }
36     return 0;
37 }

 

posted @ 2017-04-18 20:21  Kiven#5197  阅读(336)  评论(0编辑  收藏  举报