问题描述:
一列货运火车从出发站出发时火车上一共同拥有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;
}