某城市有一个火车站,铁轨铺设如下图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并使出车站。为了重组车厢,你可以借助中转站C;这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A进入C,就不能再回到A了;一旦从C进入B,就不能回到C了。换言之,在任意时刻,只有两种选择:A->C和C->B。
样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1
样例输出:
Yes
No
Yes
1 #include <stdio.h> 2 #define MAXN 1000 + 10 3 int n, target[MAXN]; 4 5 int main(void) 6 { 7 while(scanf("%d", &n) == 1) 8 { 9 int stack[MAXN], top = 0; 10 int A = 1, B = 1; 11 for(int i = 1; i <= n; i++) 12 scanf("%d", &target[i]); 13 int ok = 1; 14 while(B <= n) 15 { 16 if(A == target[B]) { A++; B++; } //车厢按顺序进出中转站C,则跳出循环 17 else if(top && stack[top] == target[B]) { top--; B++; }//若车厢按逆序进中转站C,则跳出循环 18 else if(A <= n) stack[++top] = A++; //调整车厢为逆序出中转站C 19 else { ok = 0; break; } //车厢既不是按顺序,也不是按逆序进出中转站C 20 } 21 printf("%s\n", ok ? "Yes" : "No"); 22 } 23 return 0; 24 }