HDU 2553 N皇后问题(dfs)
N皇后问题
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
题目简单翻译:
算了吧,中文。。。。难道要我翻译成英文不成。
解题思路:深度优先搜索(dfs)
一行一行的往下搜索,如果两点(x1,y1),(x2,y2)在同一条斜线上,那么x1+y1=x2+y2或者x1-y1=x2-y2;所以我们只要判断四个条件,就能判断两个点是否能互相攻击.
代码:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int inf=0x3f3f3f3f; 5 int ans[12],n,vis[4][40]; 6 int sum; 7 bool check(int x,int n)//检查(x,n)这个点是否能被攻击到 8 { 9 return vis[0][x]==0&&vis[1][n]==0&&vis[2][x+n]==0&&vis[3][20+x-n]==0; 10 } 11 void set_value(int x,int n,int value) 12 { 13 vis[0][x]=vis[1][n]=vis[2][x+n]=vis[3][20+x-n]=value; 14 } 15 void dfs(int x) 16 { 17 if(x>=n)//如果已经填上了n个点,那么结果加一 18 { 19 sum++; 20 return; 21 } 22 for(int i=0;i<n;i++) 23 if(check(x,i)) 24 { 25 set_value(x,i,1); 26 dfs(x+1); 27 set_value(x,i,0); 28 } 29 } 30 int solve(int a) 31 { 32 sum=0; 33 memset(vis,0,sizeof vis); 34 dfs(0); 35 return sum; 36 } 37 38 int main() 39 { 40 memset(ans,0x3f,sizeof ans); 41 while(scanf("%d",&n)!=EOF&&n) 42 { 43 if(ans[n]==inf) ans[n]=solve(n); 44 printf("%d\n",ans[n]); 45 } 46 return 0; 47 }