某城市有一个火车站,铁轨铺设如下图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让它们按照某种特定的顺序进入B方向的铁轨并使出车站。为了重组车厢,你可以借助中转站C;这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A进入C,就不能再回到A了;一旦从C进入B,就不能回到C了。换言之,在任意时刻,只有两种选择:A->C和C->B。《算法竞赛入门经典》6.1.2栈和队列-铁轨
样例输入:
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 }
View Code

相关文章: