3 123 321 3 123 312
Yes. in in in out out out FINISH No. FINISHFor the first Sample Input, we let train 1 get in, then train 2 and train 3. So now train 3 is at the top of the railway, so train 3 can leave first, then train 2 and train 1. In the second Sample input, we should let train 3 leave first, so we have to let train 1 get in, then train 2 and train 3. Now we can let train 3 leave. But after that we can't let train 1 leave before train 2, because train 2 is at the top of the railway at the moment. So we output "No.".HintHint
这道题只需要把火车出入的细节处理好,别把自己绕晕就好做了。
说说我的思路:
1.这道题操作只有两种,进栈和出栈,如果待入栈火车和最顶目标相同的话,那就进入、出去两个连续的步骤。
2.如果不同,那就考虑栈顶元素和最顶目标是否相同,如果相同,则栈顶元素出栈。
3.如果进行到这一步,就表示这一轮没有火车可以出栈了,则压入一节火车,进行下一轮对比。但是这里要注意思考:是否还有待入栈火车,如果没有的话,则gameover,标记并跳出循环。
上面的过程记录一下,最后分情况输出就行啦。
代码如下:
#include <cstdio> #include <queue> #include <stack> #include <algorithm> using namespace std; int main() { int n; char o1[22],o2[22]; int op[22],num; //记录操作, 1为入,0为出 bool ans; while (~scanf ("%d",&n)) { getchar(); scanf ("%s %s",o1,o2); stack<char>s; num=1; ans=true; int x=0; //对o1数组的操作 for (int i=0;i<n;i++) { if (o1[x]==o2[i]) { op[num++]=1; op[num++]=0; //如果最顶目标相同,则一出一入并记录 x++; //对下一节判断 } else if (!s.empty() && o2[i]==s.top()) { s.pop(); op[num++]=0; } else if (x<=n) //如果没有可以出去的火车且入站口有车,则继续进入并记录 { s.push(o1[x++]); op[num++]=1; i--; } else { ans=false; break; } } if (ans) //分情况输出 { printf ("Yes.\n"); for (int i=1;i<=n*2;i++) { if (op[i]) //若op为1,则输出in printf ("in\n"); else printf ("out\n"); } printf ("FINISH\n"); } else { printf ("No.\nFINISH\n"); } } return 0; }