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

UAa514 例题6-2 铁轨 Rails

2017-07-24 16:49 225 查看

原题链接: UVA-514

题目大意:

 某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1-n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶入车站。例如,出栈顺序(5
4 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。

                        


解题思路:

 看完《算法竞赛入门经典》上给的题目之后,不是特别明白,就又找原题看了看。

 看的时候一开始以第一念头就是暴力求出所有的可能性,然后在进行比较。使用栈是肯定的了。后来仔细想想太麻烦,而且很有可能超时,就放弃了。然后看了看刘汝佳的代码又结合着别的小伙伴的思路。恍然大悟,A推B不好推,那就B推A.

 大致思路就是(内容取自上面的小伙伴):

  从A->C和从C->B,例如要求顺序是[5,4,1,2,3],A中的原顺序是[1,2,3,4,5],那么接下来有两个操作,如果B要求的第一个等于A中的第一个,那么直接从A->B,否则

  如果C的栈顶等于B要求的第一个,那么C->B

  如果都不是,那么只能A->C了

  如果以上都不成立,也就是说A里面已经没有数据了,那说明该要求顺序是不可能出现的


代码:

#include <iostream>
#include <stack>

using namespace std;

const int maxn = 1000 + 10;

int crg[maxn];

int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n,sign=0;
while (cin >> n && n)				//读入车厢个数
{
while (cin >> crg[1] && crg[1]) //如果读入为0,则说明对该列火车的判断结束
{
stack<int> station;
for (int i = 2; i <= n; i++)
{
cin >> crg[i];
}
int A, B, ok;
A = B = ok = 1;
while (B <= n)
{
if (A == crg[B])	//A位置的车厢可以直接到B
{
A++; B++;
}
else if (!station.empty() && station.top() == crg[B]) //B位置的车厢正是C栈顶元素
{
B++;
station.pop();
}
else if (A <= n)	//A,C 位置均没有与B对应的车厢,则应该先进站
{
station.push(A);
A++;
}
else				//以上欠款均不符合,A处已经没有车厢
{
ok = 0;
break;
}
}
if (ok)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: