UVA - 514 Rails

来源:互联网 发布:ios 数据共享 编辑:程序博客网 时间:2024/06/05 06:04
#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
原创粉丝点击