UVA - 514 Rails

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>

using namespace std;

const int maxn = 1000 + 5;
int train[maxn];                //B站的火车要求序列
stack<int> station;             //模拟火车进站 后进先出
int n;

int main()
{
    while(~scanf("%d", & n) && n)   //输入火车长度 并且 长度为0结束程序
    {
        while(1)
        {
            memset(train, 0, sizeof(train));
            scanf("%d", & train[1]);
            if(!train[1])
                break;              //判第一个元素是否是0 如果是0 就重新输入n
            for(int i = 2; i <= n; i ++)
                scanf("%d", & train[i]);    //继续输入
            while(!station.empty())
                station.pop();              //一定要清空栈(因为有可能因为上次循环而有数已经存入)
            int a = 1;                      //A站火车是按1,2,....n的序列
            int b = 1;                      //B站火车的下标
            while(a <= n)
            {
                station.push(a);            //将a投入栈
                while(!station.empty() && station.top() == train[b])    //判断栈顶元素是否可以出栈(循环)
                {
                    station.pop();          //出栈
                    b ++;                   //继续判断下一个train[]
                }
                a ++;
            }
            if(station.empty())             //如果栈为空 则满足题意
                printf("Yes\n");
            else
                printf("No\n");
        }
        printf("\n");                       //格式
    }
    return 0;
}

题意:
A站的火车是按1,2,3…n的序列驶入station。再从station驶入B站。问是否可以按B站显示的火车序列驶入。
题解:
这道题的题意我真的是看很久。有的翻译上写着火车可以自由移动,什么鬼,自由移动不就什么序列都可以了么?后来经过几番询问,差不多可以这样理解:只能按1,2,3,…n的顺序驶入station,每个车厢驶入station后,有两种选择,一种是停留在station,另一种选择是驶出sation。按照这个规则,判断是否能产生B站那样的序列。例如: 1 3 2 5 4 ——1入 直接出。2入 停留。3入 直接出。2 出。4入 停留。5入 直接出。4出。这样就能产生 1 3 2 5 4这个序列。此题就是借助栈,也是一道经典的栈问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值