HDU-2553
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22760 Accepted Submission(s): 10136Problem Description在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input1850Sample Output19210
首先我们要知道 对于向右下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 }