题目:铁轨
题目链接:UVa514链接
题目描述:
某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1-n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶入车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。
题目分析:
为了重组车厢,借助中转站,对于每个车厢,一旦从A移入C就不能回到A了,一旦从C移入B,就不能回到C了,意思就是A->C和C->B。而且在中转站C中,车厢符合后进先出的原则。故这里可以看做为一个栈。
题目分析:感觉思想这个东西还是很重要呀,很多东西想不到呢
书中给的代码最核心的是用了a这个变量来记录已经进入栈中最大的数据。如果将要出栈的数据大于这个数据,那么使得a++,再继续循环。如果比这个数据小但是却和栈顶元素不相等则可以证明这个顺序不可能存在。
#include <iostream>
#include <stack> const int MAXN=+; int target[MAXN]; using namespace std; int main()
{
stack<int> s;
int n,t;
t=;
target[]=;
while(cin>>n&&n){
while(cin>>target[]&&target[]){
for(int i=;i<=n;i++){
cin>>target[i];
}
int a=,b=;
int ok=;
stack<int> s;
while(b<=n){
if(target[b] == a){a++;b++;}
else if(!s.empty()&&s.top()==target[b]){s.pop();b++;}
else if(a<=n){s.push(a++);}
else {ok=; break; }
}
if(ok==)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
cout<<endl;
}
return ;
}
不知道为啥还是不能ac,说是表达错误...心好累,求大神指教...
11.4修改:终于AC了,错误的原因是当n为0的时候没有直接结束输入..还是英文题读起来题意的理解有问题..