514 - Rails

来源:互联网 发布:推广与优化的区别 编辑:程序博客网 时间:2024/05/08 05:43

Rails

PS:因为该题排版较麻烦,这里给出OJ网址:UVa514 - Rails


某城市有一个火车站,铁轨铺设如图6-1所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。

这里写图片描述

为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择:A→C和C→B。

#include <cstdio>#include <stack>using namespace std;const int maxNum = 1005;int main() {    int n;    while(scanf("%d", &n) == 1 && n) {        while(true) {            // 临时栈            stack<int> st;            // 出栈顺序是否正确            bool status = true;            // 标记进栈序号            bool flag[maxNum];            for(int i = 1; i <= n; i++) {                flag[i] = false;            }            // 先输入一个数字进行判断            int num;            scanf("%d", &num);            if(num == 0) {                break;            }            // 后n-1个数字            for(int i = 2; i <= n; i++) {                // 将未被标记且小于等于num的数按从小到大的顺序加入栈中                for(int j = 1; j <= num; j++) {                    if(!flag[j]) {                        st.push(j);                        flag[j] = true;                    }                }                // 如果出栈顺序正确,则每一次栈顶元素都应当等于输入数字                if(st.top() == num){                    st.pop();                } else {                    status = false;                }                scanf("%d", &num);            }            if(status) {                printf("Yes\n");            } else {                printf("No\n");            }        }        printf("\n");    }    return 0;}
0 0
原创粉丝点击