铁轨(Rails) Uva514
题目某个城市右一个火车站,铁轨铺设如图所示,有nnn节车厢从AAA方向驶入车站,并且按照进站顺序编号为111~nnn。你的任务是判断是否能让它们按照某种特定的顺序进入BBB方向的铁轨并驶出车站。驶入车站的车厢必须按照相反的顺序输出车站,对于每个车厢而言,只能从A−车站−BA-车站-BA−车站−B。思路我们可以用AAA表示此时驶入车站的车厢的编号,target[B]target[B]target[B
题目
某个城市右一个火车站,铁轨铺设如图所示,有
n
n
n节车厢从
A
A
A方向驶入车站,并且按照进站顺序编号为
1
1
1~
n
n
n。你的任务是判断是否能让它们按照某种特定的顺序进入
B
B
B方向的铁轨并驶出车站。驶入车站的车厢必须按照相反的顺序输出车站,对于每个车厢而言,只能从
A
−
车
站
−
B
A-车站-B
A−车站−B。
思路
我们可以用
A
A
A表示此时驶入车站的车厢的编号,
t
a
r
g
e
t
[
B
]
target[B]
target[B]表示当前判断到的驶出车站的第
B
B
B个车厢的编号。用
s
t
a
c
k
<
i
n
t
>
S
stack<int> S
stack<int>S表示车站中的车厢顺序。
接下来只有三种情况
开始判断后,若发现A中的车等于B中的车,则说明了,这辆车进站后立即出站。
若发现B中的车等于栈S中的第一个,那么说明此时,栈S的中的车要出站。
若发现A中还有剩余,则让A进站。
若以上操作都无法实现,就代表没办法输出B中顺序的车厢。
具体代码
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
const int MAXN=1000+10;
int n,target[MAXN];
int main()
{
while(scanf("%d",&n)==1)//多组输入
{
stack<int> s;
int A=1,B=1;
for(int i=1;i<=n;i++)
{
cin>>target[i];//读入B中的序列
}
int ok=1;
while(B<=n)
{
if(A==target[B]{A++,B++;}
else if(!s.empty()&&s.top()==target[B]){s.pop();B++;}
else if(A<=n) s.push(A++);
else {ok=0;break;}
}
cout<<ok?"Yes":"No";
}
return 0;
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)