题目大意:某城市有一个火车站,铁轨成Y字形,有n节车厢从A方向驶入车站,按进站顺序编号1-n,现在给你一个序列代表进入B的顺序,你可以借助一个C中转站,问能否可以按这样的序列驶入B。
解题思路:栈模拟,中转站就代表栈,将车厢入栈后,只能从栈顶一个一个出去。注意输出每个cas都有一个空行。
代码:
#include <cstdio> #include <cstring> #include <stack> using namespace std; const int N = 1005; int tail[N], n; stack<int> s; bool ok () { while (!s.empty()) { s.pop(); } int k = 1; int p = 0; while (k <= n && p < n) { if (k == tail[p]) { p++; k++; } else if (!s.empty() && s.top() == tail[p]) { s.pop(); p++; } else { s.push (k); k++; } } while (!s.empty() && p < n) { if (s.top() == tail[p]) { s.pop(); p++; } else break; } if (p == n) return true; return false; } int main () { bool flag; while (scanf ("%d", &n) && n) { flag = 1; while (1) { for (int i = 0; i < n; i++) { scanf ("%d", &tail[i]); if (!tail[i]) { flag = 0; break; } } if (!flag) break; printf ("%s\n", ok() ? "Yes": "No"); } printf ("\n"); } return 0; }
时间: 2024-11-08 19:00:20