HDU 2553 N皇后问题 DFS 简单题

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

 

只需要开一个数组,vis[i] 表示第i行的皇后要放在vis[i]这一列。
 
 1 #include<cstdio>
 2 #include<cstring>
 3 int vis[12];
 4 int n;
 5 int ans;
 6 bool judge(int cnt,int t)
 7 {
 8     for(int i=1;i<cnt;i++)
 9         if(vis[i]==t)
10             return false;
11     for(int i=1;i<cnt;i++)
12         if(t-vis[i]==cnt-i||vis[i]-t==cnt-i)
13             return false;
14     return true;
15 }
16 void dfs(int cnt)
17 {
18     if(cnt==n+1)
19     {
20         ans++;
21         return ;
22     }
23     for(int i=1;i<=n;i++)
24     {
25         if(judge(cnt,i)&&!vis[cnt])
26         {
27             vis[cnt]=i;
28             dfs(cnt+1);
29             vis[cnt]=0;
30         }
31     }
32 
33 }
34 int main()
35 {
36     while(scanf("%d",&n))
37     {
38         if(n==0)
39             break;
40         memset(vis,0,sizeof(vis));
41         ans=0;
42         dfs(1);
43         printf("%d\n",ans);
44     }
45     return 0;
46 }
第一份代码

 

上面的代码tle了,所以我直接用它来打表。
 
 1 #include<cstdio>
 2 int vis[11]={0,1,0,0,2,10,4,40,92,352,724};
 3 int main()
 4 {
 5     int n;
 6     while(scanf("%d",&n))
 7     {
 8         if(n==0)
 9             break;
10         printf("%d\n",vis[n]);
11     }
12     return 0;
13 }
提交代码

 

 
 
 
 
posted on 2015-04-04 15:07  _fukua  阅读(268)  评论(0编辑  收藏  举报