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

HDU-4272 LianLianKan (dfs)

时间:2019-07-22 13:25:25      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:second   tor   lse   方案   操作   for   class   int   scanf   

题意:多测试样例,N个元素(1 <= N <= 1000),每个元素的值为(0<= ai <= 2,000,000,000),这些元素被压入栈中,与栈顶相同的可以一起消除(每次将与top相同的相连必须距离在6以内),问最后是否能将整个栈弹出
思路:用dfs来递归寻找可能的方案
关于删除操作(一开始想到用list但是感觉按位置删除比较麻烦所以用vis[]数组模拟)
(优化):如果n为奇数也消除不完(没有匹配的),如果某个数的个数为奇数,那么这个栈绝对弹不完,所以这样就可以提前预判一些 。(我们可以用map来统计每个数的个数)

完整代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;

int vis[1001],a[1001];

int dfs(int n)
{
    int i=0,j=n-1;
    while(n>=0&&vis[n]) --n;
    if(n==-1) return 1;
    if(n==0&&!vis[0]) return 0;
    while(i<=5)
    {
        if(j<0) return 0;
        if(vis[j]) --j;
        if(a[n]==a[j])
        {
            vis[j]=1;
            if(dfs(n-1)) return 1;
            vis[j]=0;
        }
        ++i;
        --j;
    } 
    return 0;
}

int main()
{
    int k,m,q,t,p,n;
    int T;
    map<int,int> mp;
    map<int,int>::iterator it;
    
    while(cin>>n)
    {
        
        t=0;
        for(int i=0;i<n;++i)
        {
            scanf("%d",&a[i]);
            vis[i]=0;
            mp[a[i]]++;
        }
        if(n&1) {
            cout<<0<<endl;
            continue; 
        }
        
        for(it=mp.begin();it!=mp.end();++it)
        {
            if((*it).second%2)
            {
                t=1;
                break;
            }
        }
        
        if(t)
        {
            cout<<0<<endl;
        }else
        {
            cout<<dfs(n-1)<<endl;
        }

    }
    return 0;
}

 

HDU-4272 LianLianKan (dfs)

标签:second   tor   lse   方案   操作   for   class   int   scanf   

原文地址:https://www.cnblogs.com/Tianwell/p/11225162.html

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