• UVa 127 线性表模拟题


    感觉这是一道很恶心的模拟题,英语太渣,看得很勉强就上网搜了一下知道题目的大意:<p>有52张扑克牌(大小王去掉了),每张牌用两个字符表示:例如 8H 第一个字符代表大小,第二个代表花色,现在开始发牌,如果发到的这张牌前面第3堆(或者第1堆)最上面有这种花色或者这个大小的牌 ,就把这张牌放到那堆上面,然后再向前面看可不可以再将这张牌放到更前面,知道不能放位置,如果前面的第1堆和第3堆都能放,优先放到第三堆上面,放完以后看看这张牌后面的牌能不能进行相同的操作,直到所有的牌都不能进行操作为止,再放下一张牌,最后问你,52张牌都放完并且操作完共剩了多少堆,并且输出堆数和相应堆数的牌数。</p><p>这道题还有一个坑,就是最后输出的时候1 堆要用pile,被这个错误坑了2次,唉。。。

    下面是AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    struct Stack
    {
        int cnt;
        char s[52][3];
    };
    char s[53][3];
    int len;
    int mark;
    Stack q[52];
    
    bool match(char *s1,char *s2)
    {
        if(s1[0]==s2[0] || s1[1]==s2[1])
            return true;
        return false;
    }
    void add(char *s,Stack *p)
    {
        strcpy((*p).s[(*p).cnt++],s);
    }
    void cpy(Stack *p1,Stack *p2)
    {
        (*p1).cnt=(*p2).cnt;
        for(int i=0;i<(*p1).cnt;i++)
        {
            strcpy((*p1).s[i],(*p2).s[i]);
        }
    }
    void sort(Stack *p,int m)
    {
        len--;
        for(int i=m;i<=len;i++)
        {
            cpy(&p[i],&p[i+1]);
        }
    }
    
    
    void opert(Stack *p,int m)
    {
        if(m==0)
        {
            mark=0;
            return;
        }
        else
            if(m>=3 && match(p[m].s[p[m].cnt-1],p[m-3].s[p[m-3].cnt-1]))
            {
                add(p[m].s[p[m].cnt-1],&p[m-3]);
                p[m].cnt--;
                if(p[m].cnt==0)
                    sort(p,m);
                opert(p,m-3);
            }
        else
            if(match(p[m].s[p[m].cnt-1],p[m-1].s[p[m-1].cnt-1]))
            {
                add(p[m].s[p[m].cnt-1],&p[m-1]);
                p[m].cnt--;
                if(p[m].cnt==0)
                    sort(p,m);
                opert(p,m-1);
            }
        else
        {
            mark=m;
            return;
        }
    }
    void digui(Stack *p)
    {
        if(mark==len)
        {
            return;
        }
        while(mark!=len)
        {
            mark++;
            opert(p,mark);
        }
    }
    int main()
    {
        //freopen("test.in","r",stdin);
        while(scanf("%s",s[0])!=EOF && s[0][0]!='#')
        {
            for(int i=0;i<52;i++)
                q[i].cnt=0;
            len=0;
            q[len].cnt++;
            strcpy(q[len].s[0],s[0]);
            for(int i=1;i<52;i++)
            {
                scanf("%s",s[i]);
                if(i==25)
                    getchar();
                if(len>=2 && match(q[len-2].s[q[len-2].cnt-1],s[i]))
                {
                    add(s[i],&q[len-2]);
                    mark=len-2;
                    opert(q,len-2);
                    digui(q);
                }
                else
                    if(match(q[len].s[q[len].cnt-1],s[i]))
                    {
                        add(s[i],&q[len]);
                        mark=len;
                        opert(q,mark);
                        digui(q);
                    }
                else
                {
                    q[++len].cnt=1;
                    strcpy(q[len].s[0],s[i]);
                }
            }
            if(len==0)
                printf("%d pile remaining:",len+1);
            else
            {
                printf("%d piles remaining:",len+1);
            }
            for(int i=0;i<=len;i++)
            {
                printf(" %d",q[i].cnt);
            }
            printf("
    ");
        }
        return 0;
    }
    
    


  • 相关阅读:
    opencv源码编译安装后使用时出现undefined reference cv::imwrite
    OPPO手机永久打开USB调试模式
    bash 顺序执行等待前一个脚本执行完成
    cpp
    多线程
    关于nvme下ubuntu无法识别硬盘的问题
    极限建站
    新生赛
    pc_mbed_fpga_communication
    color_sensor_mbed
  • 原文地址:https://www.cnblogs.com/hqwhqwhq/p/4555891.html
Copyright © 2020-2023  润新知