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

HDU4272LianLianKan(dfs)

时间:2015-10-09 00:29:45      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

Problem Description
I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack.
Now we have a number stack, and we should link and pop the same element pairs from top to bottom. Each time, you can just link the top element with one same-value element. After pop them from stack, all left elements will fall down. Although the game seems to be interesting, it‘s really naive indeed. 
技术分享

To prove I am a wisdom among my friend, I add an additional rule to the game: for each top element, it can just link with the same-value element whose distance is less than 6 with it. 
Before the game, I want to check whether I have a solution to pop all elements in the stack.
 

 

Input
There are multiple test cases.
The first line is an integer N indicating the number of elements in the stack initially. (1 <= N <= 1000)
The next line contains N integer ai indicating the elements from bottom to top. (0 <= ai <= 2,000,000,000)
 

 

Output
For each test case, output “1” if I can pop all elements; otherwise output “0”.
 

 

Sample Input
2
1 1
3
1 1 1
2
1000000 1
 

 

Sample Output
1
0
0
 
 

 

Source

 


 

 

注意给的顺序是从底部到顶部。

开始想直接模拟,不可行,因为在下面5个里可能有一个或多个相同的元素,每个选择都可能对后面造成影响,因此要dfs。

其中还巧妙的用了map,当然改用set来存然后看里面到底有没有奇数个的元素也是可以的,这点的优化很重要。

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<set>
 8 #include<map>
 9 
10 using namespace std;
11 
12 int vis[1001],a[1001];
13 
14 int dfs(int n)
15 {
16     int i=0,j=n-1;
17     while(n>=0&&vis[n]) --n;
18     if(n==-1) return 1;
19     if(n==0&&!vis[0]) return 0;
20     while(i<=5)
21     {
22         if(j<0) return 0;
23         if(vis[j]) --j;
24         if(a[n]==a[j])
25         {
26             vis[j]=1;
27             if(dfs(n-1)) return 1;
28             vis[j]=0;
29         }
30         ++i;
31         --j;
32     } 
33     return 0;
34 }
35 
36 int main()
37 {
38     int k,m,q,t,p,n;
39     int T;
40     map<int,int> mp;
41     map<int,int>::iterator it;
42     
43     while(cin>>n)
44     {
45         t=0;
46         for(int i=0;i<n;++i)
47         {
48             scanf("%d",&a[i]);
49             vis[i]=0;
50             mp[a[i]]++;
51         }
52         
53         for(it=mp.begin();it!=mp.end();++it)
54         {
55             if((*it).second%2)
56             {
57                 t=1;
58                 break;
59             }
60         }
61         
62         if(t)
63         {
64             cout<<0<<endl;
65         }else
66         {
67             cout<<dfs(n-1)<<endl;
68         }
69 
70     }
71     return 0;
72 }

 

HDU4272LianLianKan(dfs)

标签:

原文地址:http://www.cnblogs.com/Traveller-Leon/p/4862607.html

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