您的位置:首页 > 大数据 > 人工智能

UVA514 Rails (stack)

2017-10-19 22:41 531 查看
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=455

题意:从A方向来一个1,2,3,4.....N顺序的列车,经过车站,输入一个从B出来的列车的编号a1,a2,a3,a4....an,问从B出来的列车编号是否合法。对于车站来说,只能够从A进从B出,每次只能够有一个操作(从A进或者从B出,还可以待在车站);

思路:用栈来模拟;

详细看下面代码:

#include <cstdio>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std;

int n,a[1100],vis[1100];
stack<int > sa;

int main(){
while(~scanf("%d",&n)){
while(~scanf("%d",&a[1])){
if(!a[1]){
printf("\n");
break;
}
while(!sa.empty()) sa.pop();
for(int i = 2; i <= n; i ++) scanf("%d",&a[i]);

memset(vis,0,sizeof(vis));
int cnt = 0, k = 1;
for(int i = 1; i <= n && k <= n;){//判断第一个与第一个出来的车相等的编号
if(a[i] == k){
vis[k] = 1;
cnt ++,k ++, i ++;
while(!sa.empty() && a[i] == sa.top()){//第一个车出车站后,判断车站内的其他车是否是第2,3个出车站的
sa.pop(); i ++;
}
continue;
}
while(a[i] != k && k <= n){//编号为k的车不该出车站则要停留在车站内,即入栈操作
sa.push(k); k ++;
}
}
k = 1;
while(!sa.empty()){//判断车站内剩的其他车是否会和B出站的车的编号顺序一样
if(!vis[a[k]] && sa.top() == a[k])sa.pop(),k ++;
else if(vis[a[k]]) k ++;
else break;
}
if(sa.empty()) printf("Yes\n");//栈空则表示车站内的车全部从B出去
else printf("No\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: