POJ 1036 Rails 模拟堆栈

水题,主要是思路清晰,判断明确。

记x为A站最前方的车,y表示下一列要进入B站的车厢,初识时,x=1;y=a1;C=[];

在调度过程中:

if(y==0)那么调度成功,退出模拟过程;否则

  if(x==y)就是说接下来进站的正好是要出去的,那就直接让它A—>B 否则

      if(C不空 && y=(最后进入C的火车)) 让车从C开出进入B  否则

         if(x!=0)那么车 A—>C 否则  无解  

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<stack>

using namespace std;

const int maxn=1005;

stack <int> C;

int n,a,b,x,y;

int A[maxn],B[maxn];

int main(){

    while(scanf("%d",&n)&& n){

        memset(B,0,sizeof(B));

        memset(A,0,sizeof(A));

        while(scanf("%d",&B[0])&&B[0]){

            for(int i=1;i<n;i++)scanf("%d",&B[i]);

            for(int i=0;i<n;i++)A[i]=i+1;

            a=0;b=0;y=B[b];x=A[a];

            while(!C.empty())C.pop();

            while(true){

                if(y==0){//over

                    printf("Yes\n");

                    break;

                }else{

                    if(x==y){//A-->B

                        x=A[++a];

                        y=B[++b];

                    }else{

                        if(!C.empty()&&y==C.top()){//C-->B

                            y=B[++b];

                            C.pop();

                        }else{

                            if(x!=0){//A-->C

                                C.push(x);

                                x=A[++a];

                            }else{

                                printf("No\n");

                                break;

                            }

                        }

                    }

                }

            }





        }

    printf("\n");

    }

    return 0;

}

你可能感兴趣的:(Rails)