码迷,mamicode.com
首页 > 其他好文 > 详细

[ An Ac a Day ^_^ ] hdu 2553 N皇后问题 搜索

时间:2016-10-03 21:19:08      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

曾经想过一天一AC 坚持下来的确不容易额 (我是没坚持下来 尽量以后坚持……

经典的N皇后问题 搜索的入门问题 学了这么久竟然一直没敲过 今天敲一下……

这道题也不是很简单额 纯暴力就超时了 要打一下表……

而且有一个小的优化

每次判断是否合理不用铺满图再判断

只需要判断当前放皇后的位置的上方 左上和右上有没有皇后就可以了

自己想也不好想-_-||

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<math.h>
 5 #include<string.h>
 6 #include<string>
 7 #include<map>
 8 #include<set>
 9 #include<vector>
10 #include<queue>
11 #include<list>
12 #define M(a,b) memset(a,b,sizeof(a))
13 using namespace std;
14 typedef long long ll;
15 const int inf=0x3f3f3f3f;
16 const int maxn=1e1+10;
17 int dx[8]= {0,0,1,-1,1,-1,1,-1};
18 int dy[8]= {1,-1,0,0,-1,1,1,-1};
19 //---------------------------------------ヽ(^。^)丿
20 int cnt,n,ans[maxn];
21 int _map[maxn];
22 void dfs(int x)
23 {
24     if(x>n)
25     {//只要能搜到这一步一定符合条件了
26         cnt++;
27         return ;
28     }
29     for(int i=1; i<=n; i++)
30     {
31         _map[x]=i; //放置皇后
32         bool ok=true;
33         for(int j=x-1;j>=1;j--)
34             if(_map[j]==i|| //正上方
35                _map[j]==i-x+j|| //左上方
36                _map[j]==i+x-j) //右上方
37                     ok=false;
38         if(ok) dfs(x+1); //符合条件继续搜索
39     }
40     return ;
41 }
42 int main()
43 {
44     M(ans,-1);
45     while(~scanf("%d",&n)&&n)
46     {
47         if(ans[n]!=-1)
48             printf("%d\n",ans[n]);
49         else
50         {
51             M(_map,-1);
52             cnt=0;
53             dfs(1);
54             ans[n]=cnt; //打表
55             printf("%d\n",cnt);
56         }
57     }
58     return 0;
59 }
60 /*
61 
62 1
63 8
64 5
65 0
66 
67 */

 

[ An Ac a Day ^_^ ] hdu 2553 N皇后问题 搜索

标签:

原文地址:http://www.cnblogs.com/general10/p/5929579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!