模拟栈
按照目标一个一个试着移动即可
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <vector> #include <list> #include <stack> using namespace std; #define REP(n) for(int o=0;o<n;o++) const int maxn = 1005; bool Do() { int n; int a[maxn]; scanf("%d",&n); if(n == 0) return false; while(scanf("%d",&a[0]),a[0] != 0) { REP(n - 1) scanf("%d",&a[o + 1]); stack<int> S,A; REP(n) A.push(n - o); bool ok = true; //尝试将编号i+1出站 for(int i = 0;i < n;i++) { //从中转站出站 /* while的原理 如果中转站中的车符合要求,让它出站,结束该次循环·····1 如果中转站最外面的车不符合要求,检查A口,将它进站,继续上一步·····2 如果A口已经没有车,则无解·····3 */ while(1) { if(!S.empty()&&S.top() == a[i]) {//·····1 S.pop(); break; } else {//·····3 if(A.empty()) { ok = false; break; } else {//·····2 S.push(A.top()); A.pop(); } } } //不能达到题目的要求 if(!ok) break; } printf("%s",ok ? "Yes\n" : "No\n"); } printf("\n"); return true; } int main() { while(Do()); return 0; }