poj 1363 Rails 题解 栈操作 模拟

传送门:http://poj.org/problem?id=1363

Description

There is a famous railway station in PopPush City. Country there is
incredibly hilly. The station was built in last century.
Unfortunately, funds were extremely limited that time. It was possible
to establish only a surface track. Moreover, it turned out that the
station could be only a dead-end one (see picture) and due to lack of
available space it could have only one track.
在这里插入图片描述
The local tradition is that every train arriving from the direction A
continues in the direction B with coaches reorganized in some way.
Assume that the train arriving from the direction A has N <= 1000
coaches numbered in increasing order 1, 2, …, N. The chief for train
reorganizations must know whether it is possible to marshal coaches
continuing in the direction B so that their order will be a1, a2, …,
aN. Help him and write a program that decides whether it is possible
to get the required order of coaches. You can assume that single
coaches can be disconnected from the train before they enter the
station and that they can move themselves until they are on the track
in the direction B. You can also suppose that at any time there can be
located as many coaches as necessary in the station. But once a coach
has entered the station it cannot return to the track in the direction
A and also once it has left the station in the direction B it cannot
return back to the station.

Input

The input consists of blocks of lines. Each block except the last
describes one train and possibly more requirements for its
reorganization. In the first line of the block there is the integer N
described above. In each of the next lines of the block there is a
permutation of 1, 2, …, N. The last line of the block contains just
0.

The last block consists of just one line containing 0.
Output

The output contains the lines corresponding to the lines with
permutations in the input. A line of the output contains Yes if it is
possible to marshal the coaches in the order required on the
corresponding line of the input. Otherwise it contains No. In
addition, there is one empty line after the lines corresponding to one
block of the input. There is no line in the output corresponding to
the last ``null’’ block of the input.
Sample Input

5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
Sample Output

Yes
No
 
Yes

按照题目的要求模拟就行,压栈模拟车厢“进”火车站,如果栈顶与所给序列中期望被匹配的元素相同则说明这节车厢该出火车站了,所以就弹栈。
输出格式需要注意一下:“there is one empty line after the lines corresponding to one block of the input”每个块后有个空行。根据样例输出可知:一个n对应的所有的序列为一个块。

#include<iostream>
using namespace std;
int n;
int coaches[1001];

bool judge()
{
    
    
    int stack[1001];
    int top=0,p=1;//top为stack栈顶 p为coaches中期望被匹配的元素的下标
    for(int i=1;i<=n;i++)
    {
    
    
        top++;//压栈
        stack[top]=i;
        while(top>=1 && stack[top]==coaches[p])
        {
    
    
            p++;
            top--;//弹栈
        } 
    }
    if(top==0)//全部得到匹配,则压的全部被弹出来了,top还是初值0
    return true;
    else
    return false;
}
int main()
{
    
    
    int t=0;
    while(scanf("%d",&n),n) //先执行输入,再判断n是否为0
    {
    
    
        if(t)
        printf("\n");
        t++;
        
        int a;
        while(scanf("%d",&a),a)
        {
    
    
            coaches[1]=a;
            for(int i=2;i<=n;i++)
                scanf("%d",&coaches[i]);
            if (judge())
            printf("Yes\n");
            else
            printf("No\n");
        }

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42378324/article/details/108134736