(栈自己实现)Flipper

题目链接

HUD 3328

题目大意

emmm,说实话,英语水平有限,一开始布吉岛他说了啥,自己试了好几次结果都不一样
其实就是,把最左边或者最右边的牌先反转,再叠加到旁边的牌上,然后移动的时候,符合栈的特点

思路

① 如果用栈的话,我jio得可以用四个栈,一边两个来回换,倒来倒去实现
② 不用栈的话,就直接数组模拟了,开一个二维数组,只不过!!!!每次开二维数组都会把行列弄混,我就说怎么结果不正确,debug之后再知道又把行跟列记错了,5555

代码

#include <iostream>

using namespace std;

typedef struct card
{
    int num;
    char d;
} myCard;

myCard stk[105][105];

int main()
{
    int n;
    int height[105];  //记录高度
    int f=1;
    while(cin>>n && n!=0)
    {
        for(int i=1; i<=n; i++)  //把牌铺开
        {
            stk[1][i].num = i;
            char ch;
            cin>>ch;
            stk[1][i].d = ch;
            height[i]=1;
        }

        getchar();
        char c;
        int head=1,tail=n;
        int h;

        for(int i=0; i<n-1; i++) //开始模拟翻转操作了
        {
            cin>>c;
            if(c=='R')   //右边
            {
                h = height[tail];
                for(int i=h; i>0; i--)
                {
                    if(stk[i][tail].d=='U')
                        stk[i][tail].d = 'D';
                    else
                        stk[i][tail].d = 'U';
                    stk[++height[tail-1]][tail-1] = stk[i][tail];
                }
                height[tail] = 0;
                tail--;

            }
            else     //左边
            {
                h = height[head];
                for(int i=h; i>0; i--)
                {
                    if(stk[i][head].d=='U')
                        stk[i][head].d = 'D';
                    else
                        stk[i][head].d = 'U';
                    stk[++height[head+1]][head+1] = stk[i][head];
                }
                height[head] = 0;
                head++;
            }
        }
       int m;
       int a[105];
       cin>>m;
       for(int j=1;j<=m;j++)
            cin>>a[j];
        cout<<"Pile "<<f<<endl;
        f++;
        for(int j=1;j<=m;j++)
        {
            int hh = height[tail] - a[j] +1;
            if(stk[hh][tail].d == 'U')
                printf("Card %d is a face up %d.\n",a[j],stk[hh][tail].num);
            else
             printf("Card %d is a face down %d.\n",a[j],stk[hh][tail].num);
        }
    }
    return 0;
}

总结

① 这题很简单了,主要是模拟的时候,二维数组一定一定要看清楚第一个是行,第二个是列,写反了再改炒鸡麻烦
② 一开始偷懒不想用height[]数组记录高度,只用数字的话,提交时wa,应该是情况很复杂的时候会出错,所以以后考虑解题思路的时候,要提前把很复杂的情况考虑进去,找一个通解
③ 为了便于描述,都从1开始

//之前看过的一个电影叫《Flipped》,译名叫怦然心动,一开始看到还很激动,但是这俩好像半毛钱关系都没有哈哈哈,偷偷放个剧照叭
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值