HDU 3328 Flipper 栈 模拟

首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边的牌堆,L表示翻一下左边的牌堆,直到最后摞成了一个牌堆。后面跟着一排问题,输入i,问从上往下数的第i张牌编号,以及这张牌的状态。

这题只要读懂了题意思路也挺清晰的了,用栈进行模拟一步一步走就行了,我的思路是先对牌的状态进行计算,如果是R,就把这一步右边所有牌都翻过来,如果是L,就把这一步左边所有牌都翻过来,这样先把所有牌编号和状态都对应好了,这一步不难。

然后再处理牌的上下顺序,这一步就要用到栈了,因为每次翻牌牌的顺序都会完全翻过来,所以用两个栈,每翻一次就翻到另一个空栈里去,因为这题左边右边都在翻,所以我开了四个栈,左边两个右边两个,左边翻的时候就把左边非空栈里的内容一个一个移到左边的空栈里,这样就模拟了翻牌的过程,右边也是一样处理。这样到最后就是左边一堆牌,右边一堆牌(左边剩一个非空栈,右边剩一个非空栈),然后再考虑最后一步是左翻还是右翻,左翻就把左边栈里的清到右边栈里,右翻反之。最后剩下的一个栈就是模拟的翻完之后的顺序了。然后开一个数组再把这个栈里的元素按顺序存在数组里以方便查找,这样四个栈也都清空了,每次跑循环不必再刻意去清空了。

这样状态与顺序都排好了放进了数组里,再问哪一个顺序的牌,直接把数组拉出来cout就可以了,下面是我写的代码,有点长,其实思路挺简短= =就是再判断是不是空栈的时候我一直再用if else所以排的情况太多了导致了代码太长......

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
char zt[105];
char cz[105];
int a[105];
int res[105];
stack<int>cardl1;
stack<int>cardl2;
stack<int>cardr1;
stack<int>cardr2;

int main()
{
    int N,n;
    int k=0;
    int r,l,t;
    int i,j;
    while(scanf("%d",&N)!=EOF)
    {
        if(N==0)
            break;
        k++;
        scanf("%s",zt);
        scanf("%s",cz);
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
           scanf("%d",&a[i]);
        }
        cout<<"Pile "<<k<<endl;
        cardl1.push(1);
        cardr1.push(N);
        r=N-1;
        l=0;
        for(i=0;i<N-1;i++)
        {
            if(cz[i]==‘R‘)
            {
                for(j=r;j<N;j++)
                {
                    if(zt[j]==‘U‘)
                        zt[j]=‘D‘;
                    else
                        zt[j]=‘U‘;
                }
                r=r-1;
                if(i==N-2)
                    break;
                if(cardr2.empty())
                {
                    cardr2.push(r+1);
                    while(!cardr1.empty())
                    {
                        t=cardr1.top();
                        cardr1.pop();
                        cardr2.push(t);
                    }
                }
                else
                {
                    cardr1.push(r+1);
                    while(!cardr2.empty())
                    {
                        t=cardr2.top();
                        cardr2.pop();
                        cardr1.push(t);
                    }
                }
            }
            else
            {
                for(j=l;j>=0;j--)
                {
                    if(zt[j]==‘U‘)
                        zt[j]=‘D‘;
                    else
                        zt[j]=‘U‘;
                }
                l=l+1;
                if(i==N-2)
                    break;
                if(cardl2.empty())
                {
                    cardl2.push(l+1);
                    while(!cardl1.empty())
                    {
                        t=cardl1.top();
                        cardl1.pop();
                        cardl2.push(t);
                    }
                }
                else
                {
                    cardl1.push(l+1);
                    while(!cardl2.empty())
                    {
                        t=cardl2.top();
                        cardl2.pop();
                        cardl1.push(t);
                    }
                }
            }
        }
        //cout<<zt<<endl;
        //while(!cardl2.empty())
        //{
        //   cout<<cardl2.top()<<endl;
        //    cardl2.pop();
        //}
        if(!cardl2.empty())
        {
            if(!cardr2.empty())
            {
                if(cz[N-2]==‘R‘)
                {
                    while(!cardr2.empty())
                    {
                        t=cardr2.top();
                        cardr2.pop();
                        cardl2.push(t);
                    }
                    for(i=0;!cardl2.empty();i++)
                    {
                        res[i]=cardl2.top();
                        cardl2.pop();
                    }
                }
                else
                {
                    while(!cardl2.empty())
                    {
                        t=cardl2.top();
                        cardl2.pop();
                        cardr2.push(t);
                    }
                    for(i=0;!cardr2.empty();i++)
                    {
                        res[i]=cardr2.top();
                        cardr2.pop();
                    }
                }
            }
            else
            {
                if(cz[N-2]==‘R‘)
                {
                    while(!cardr1.empty())
                    {
                        t=cardr1.top();
                        cardr1.pop();
                        cardl2.push(t);
                    }
                    for(i=0;!cardl2.empty();i++)
                    {
                        res[i]=cardl2.top();
                        cardl2.pop();
                    }
                }
                else
                {
                    while(!cardl2.empty())
                    {
                        t=cardl2.top();
                        cardl2.pop();
                        cardr1.push(t);
                    }
                    for(i=0;!cardr1.empty();i++)
                    {
                        res[i]=cardr1.top();
                        cardr1.pop();
                    }
                }
            }
        }
        else
        {
            if(!cardr2.empty())
            {
                if(cz[N-2]==‘R‘)
                {
                    while(!cardr2.empty())
                    {
                        t=cardr2.top();
                        cardr2.pop();
                        cardl1.push(t);
                    }
                    for(i=0;!cardl1.empty();i++)
                    {
                        res[i]=cardl1.top();
                        cardl1.pop();
                    }
                }
                else
                {
                    while(!cardl1.empty())
                    {
                        t=cardl1.top();
                        cardl1.pop();
                        cardr2.push(t);
                    }
                    for(i=0;!cardr2.empty();i++)
                    {
                        res[i]=cardr2.top();
                        cardr2.pop();
                    }
                }
            }
            else
            {
                if(cz[N-2]==‘R‘)
                {
                    while(!cardr1.empty())
                    {
                        t=cardr1.top();
                        cardr1.pop();
                        cardl1.push(t);
                    }
                    for(i=0;!cardl1.empty();i++)
                    {
                        res[i]=cardl1.top();
                        cardl1.pop();
                    }
                }
                else
                {
                    while(!cardl1.empty())
                    {
                        t=cardl1.top();
                        cardl1.pop();
                        cardr1.push(t);
                    }
                    for(i=0;!cardr1.empty();i++)
                    {
                        res[i]=cardr1.top();
                        cardr1.pop();
                    }
                }
            }
        }
        //for(i=0;i<N;i++)
        //{
        //   cout<<res[i]<<endl;
        //}
        for(i=0;i<n;i++)
        {
            cout<<"Card "<<a[i]<<" is a face ";
            if(zt[res[a[i]-1]-1]==‘U‘)
                cout<<"up ";
            else
                cout<<"down ";
            cout<<res[a[i]-1]<<"."<<endl;
        }
    }
    return 0;
}

A出来之后和集训队里的大神讨论,这题他用的数组模拟写起来要比我的方法快= ="一般的用数组模拟栈就是int stk[MAXN],top;压栈的话,比如压个1就是 stk[top++]=1;退栈就是a=stk[--top];"以上大神原话→_→

时间: 2024-12-10 18:32:45

HDU 3328 Flipper 栈 模拟的相关文章

HDU 1022 Train Problem I (STL 栈模拟)

Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30420    Accepted Submission(s): 11492 Problem Description As the new term comes, the Ignatius Train Station is very busy nowaday

hdu1515 dfs栈模拟

Anagrams by Stack Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1513    Accepted Submission(s): 690 Problem Description How can anagrams result from sequences of stack operations? There are tw

用两个栈模拟实现一个队列

题目:如何用两个栈模拟实现一个队列?  如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证的队列容量是多少?(这里讨论的是顺序栈,如果是链式栈的话完全没有必要考虑空间) 分析:栈的特点是“后进先出(LIFO)”,而队列的特点是“先进先出(FIFO)”.用两个栈模拟实现一个队列的基本思路是:用一个栈作为存储空间,另一个栈作为输出缓冲区,把元素按顺序压入两栈(模拟的队列),并按此顺序出队并输出即可. 如下图,用容量为m的栈作为存储空间,容量为n的栈作为输出缓冲区,一开始先将n个元素压入(pu

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

HDU 4608 I-number--简单模拟

I-number Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 The I-number of x is defined to be an integer y, which satisfied the the conditions below: 1.  y>x; 2.  the sum of each digit of y(under base 10) is the multiple of 10; 3.  among all

ACM学习历程——UVA 127 &quot;Accordian&quot; Patience(栈;模拟)

Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patience, the rules for which are as follows: Deal cards one by one in a row from left to right, not overlapping. Whenever the card matches its immediate n

hdu 4831 Scenic Popularity(模拟)

题目链接:hdu 4831 Scenic Popularity 题目大意:略. 解题思路:对于休闲区g[i][0]和g[i][1]记录的是最近的两个景点的id(只有一个最近的话g[i][1]为0),对于景点来说,g[i][0]为-1(表示该id对应的是景点),g[i][1]为该景点的热度值.主要就是模拟,注意一些细节就可以了. #include <cstdio> #include <cstring> #include <cstdlib> #include <alg

HDOJ 4699 Editor 栈 模拟

用两个栈模拟: Editor Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1913    Accepted Submission(s): 591 Problem Description Sample Input 8 I 2 I -1 I 1 Q 3 L D R Q 2 Sample Output 2 3 Hint The fol

web前端面试系列 - 数据结构(两个栈模拟一个队列)

一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将剩余数据弹出s2,并压人s1. 思路二: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时,判断s1, 是否为空,如果不为空,则将数据直接压入s1, 如果为空,则将s2中的数据全部倒入s1,在将数据压人s1. 3. 出队时,判断s2, 是否为空,如果不为空,则直接弹出s2