UAa514 例题6-2 铁轨 Rails

原题链接: 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值