• HDU4272LianLianKan(dfs)


    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 }
  • 相关阅读:
    关于源码编译每次提示有错误 要make update-api
    如何在Android中添加系统服务
    git查看每个版本间的差异
    achartengine画出动态折线图
    java中基本数据类型和C语言中基本数据类型转换
    获取图片的真实宽高
    hdu-2066-一个人的旅行
    Linux内核模块编程与内核模块LICENSE -《具体解释(第3版)》预读
    Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜
    ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方式
  • 原文地址:https://www.cnblogs.com/Traveller-Leon/p/4862607.html
Copyright © 2020-2023  润新知