zoukankan      html  css  js  c++  java
  • UVA-127 "Accordian" Patience (模拟)

    题目大意:一种纸牌游戏,将52张扑克牌排成一列,每次操作可将一张扑克牌移到它的前一张或前面第三张上当牌的点数或花色匹配时。每次都移动最靠左的扑克牌,并且能移动三格就移动三格。求最终扑克牌状态。

    题目分析:利用栈这种数据结构模拟,以为会超时,没想到AC了。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<map>
    # include<stack>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    struct Poke
    {
        char v,f;
        Poke(char _v,char _f):v(_v),f(_f){}
    };
    char str[2];
    stack<Poke>s[52];
    
    int get(int pos,int k)
    {
        for(int i=pos-1;i>=0;--i){
            if(!s[i].empty()){
                --k;
                if(k==0)  return i;
            }
        }
        return -1;
    }
    
    bool match(const Poke &a,const Poke &b)
    {
        return a.v==b.v||a.f==b.f;
    }
    
    bool toDo(int i,int k)
    {
        Poke a=s[i].top();
        Poke b=s[k].top();
        if(match(a,b)){
            s[k].push(a);
            s[i].pop();
            return true;
        }
        return false;
    }
    
    void solve()
    {
        int i;
        while(1)
        {
            for(i=1;i<52;++i){
                if(s[i].empty())
                    continue;
                int k=get(i,3);
                if(k!=-1&&toDo(i,k))
                    break;
                k=get(i,1);
                if(k!=-1&&toDo(i,k))
                    break;
            }
            if(i>=52)
                break;
        }
    }
    
    int main()
    {
        while(scanf("%s",str))
        {
            if(str[0]=='#')
                break;
            for(int i=0;i<52;++i)
                while(!s[i].empty())
                    s[i].pop();
            s[0].push(Poke(str[0],str[1]));
            for(int i=1;i<52;++i){
                scanf("%s",str);
                s[i].push(Poke(str[0],str[1]));
                Poke u=s[i].top();
            }
            solve();
            int k=0;
            for(int i=0;i<52;++i)
                if(!s[i].empty())
                    ++k;
            if(k==1)
                printf("1 pile remaining: 52
    ");
            else{
                printf("%d piles remaining:",k);
                for(int i=0;i<52;++i)
                    if(!s[i].empty())
                        printf(" %d",s[i].size());
                printf("
    ");
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    决策模型(一):不确定型决策法
    Redis系列(二):Redis的数据类型及命令操作
    Redis系列(一):Redis的简介与安装
    java中传值方式的个人理解
    理解主从设备模式(Master-Slave)
    基于ubuntu16.04部署IBM开源区块链项目-弹珠资产管理(Marbles)
    基于ubuntu16.04快速构建Hyperledger Fabric网络
    fastjson 的使用总结
    简析淘宝网的六大质量属性
    软件架构师如何工作
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4858959.html
Copyright © 2011-2022 走看看