【C++】火车车厢重排问题

问题描述:

一列货运火车从出发站出发时火车上一共同拥有n节车厢,编号各自是1到n。运货的各节车厢是在入轨上时是随机的顺序,火车头在出轨处,如今要将各节车厢按编号从大到小挂到车头上。当中在入轨与出轨之间有k条缓冲铁轨,将通过缓冲铁轨完毕本次的火车车厢的重排。

解题思路:

首先,火车不能转向,只能通过缓冲铁轨延缓输出,当所有缓冲铁轨都至少有一辆车厢时,必须先从缓冲铁轨上移出一个车厢到出轨列。显而易见时先进先出顺序的,我们可以通过队列模拟这个过程。

简化问题,假设有九个非顺序排列的车厢,三条缓冲铁轨,我们要如何解决这个问题呢。

首先,创建出三个空队列作为缓冲铁轨,然后将九个车厢输入到另一个创建出来的队列作为入轨轨道,再创建一个空队列作为出轨轨道。

然后我们思考到,车厢进入到缓冲轨道后就只能进行输出,那么我们要尽量把所有的小序号车厢排到三条缓冲铁轨的最前方,比如三条缓冲铁轨的出队顺序最好是1 4 7,2 5 8,3 6 9。这样我们通过循环让三个队列出队就可以完成车厢重排序。但实际上我们不要求这么完美的排序,只要每条队列都是从小到大的排序,并且入轨铁轨上没有车厢时,我们就认为可以完成重排序。

很好理解,三条铁轨都是空的,第一个车厢进入第一个队列,第二个车厢判断自己是不是大于第一个车厢,如果大于,排在第一个车厢之后,如果小于,则检测队列二三有没有空队列,如果有,入队,如果没有,判断跟二三队列的队尾元素的关系是大于还是小于,有大于则入队,如果该车厢比三条队列的队尾元素都要小,就说明这个车厢没法在比他大的车厢出队前出队,自然无法完成重排序。

下面放出我的完整代码:

#include<iostream>
#include<queue>
using namespace std;
bool renewline(queue<int> line)
{
	int x;
	queue<int> line1, line2, line3;
	while (!line.empty())
	{
		x = line.front();
		line.pop();
		if (line1.empty() || x > line1.front())
		{
			line1.push(x);
		}
		else if (line2.empty() || x > line2.front())
		{
			line2.push(x);
		}
		else if (line3.empty() || x > line3.front())
		{
			line3.push(x);
		}
		else
		{
			cout << "error" << endl;
			return 0;
		}
	}
	return 1;
}

int main()
{
	queue<int> line;
	int x;
	while (getchar() != '\n')
	{
		cin >> x;
		line.push(x);
	}
	cout << renewline(line) << endl;
	return 0;
}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值