码迷,mamicode.com
首页 > 其他好文 > 详细

铁轨问题

时间:2017-03-28 21:38:55      阅读:1016      评论:0      收藏:0      [点我收藏+]

标签:它的   content   std   namespace   break   main   组合   set   max   

题目描述

每辆火车都从A方向驶入车站C,再从B方向驶出车站C,同时它的车厢可以进行某种形式的重新组合。组合方式为:最晚驶入车站C的车厢停在最前面,可在任意时间将停在最前面的车厢驶出车站C。假设从A方向驶来的火车有n节车厢(n<=1000),分别按顺序编号为1,2,...,n。假定在进入车站之前每节车厢之间都是不连着的,并且它们可以自行移动,直接到处在B方向的铁轨上。另外假定车站C里可以停放任意多节的车厢。但是一旦当一节车厢进入车站C,它就不能再回到A方向的铁轨上了,并且一旦当它进入B方向的铁轨后,它就不能再回到车站C。负责车厢调度的工作人员需要知道能否使它以a1,a2,...,an的顺序从B方向驶出。
  请写一个程序,用来判断能否得到指定的车厢顺序。
 

输入

第一行输入t(1<=t<=10),表示测试数据的组数。
第一行一个整数n,表示有n节车厢。
接下来一行有n个整数,表示对应顺序。

输出

输出仅一行。若可以,则输出“Possible”,否则输出“Impossible”。
 

样例输入

1
5
3 5 4 2 1

样例输出

Possible

数据范围限制

1<=n<=1000
在中转站C中,车厢符合后进先出的原则,因此是一个栈。代码如下:
#include<cstdio>
#include<stack>
using namespace std;
const int MAXN=1000+10;
int m,n,target[MAXN];
int main() {
    scanf("%d",&m);
    for(int k=1; k<=m; k++) {
        scanf("%d",&n);
            stack<int> s;
            int A=1,B=1;
            for(int i=1; i<=n; i++)
                scanf("%d",&target[i]);
            int ok=1;
            while(B<=n) {
                if(A==target[B]) {
                    A++;
                    B++;
                } else if(!s.empty()&&s.top()==target[B]) {
                    s.pop();
                    B++;
                } else if(A<=n)s.push(A++);
                else {
                    ok=0;
                    break;
                }
            }
            printf("%s\n",ok?"Possible":"Impossible");
        
    }
    return 0;
}

 

铁轨问题

标签:它的   content   std   namespace   break   main   组合   set   max   

原文地址:http://www.cnblogs.com/yhyl/p/6636824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!