c++火车车厢重排问题(队列实现)

问题描述:

入轨上的火车车厢号顺序:581742963,火车头利用三个缓冲轨道,在出轨上排成顺序:12345678

示意图:

主要思路:

1.先检测入轨队列、三个缓冲队列的队头元素是否等于即将要排的火车序号,如果等于,将其加入出轨队列

2.如果入轨队列队头元素不等于将要排的火车车厢序号:
    (1)将入轨队列队头元素压入一个非满的缓冲队列,并且压入的元素要大于该缓冲队列的队尾元素:
            因为假如一个缓冲队列为:9263    其中2应该比前面几个数先添加到出轨队列,然而实际中火车的行为性质和队列是一样的,只能出队头元素(先进先出的),队列是为了保证复杂度小
    (2)如果所有的缓冲轨道队尾元素都大于入轨队列的队头元素,这样的情况下没有办法进行,例如在重排中:
              入轨队列:563
              缓冲轨道一:78
              缓冲轨道二:42
              缓冲轨道三:91
           由于缓冲轨道只有三个,不能将序号为三的车厢添加到比它大的车厢后边,所以无解
3.重复以上的步骤直到车厢排完
具体的解释在代码后边:
# include <iostream>
# include <vector>
using namespace std;
int main()
{
	int order = 1;                          //定义将要排的火车车厢序号
	int train_number = 8;                   //定义入轨队列的队头的车厢号
	int rear_track_number[3] = { 9,9,9 };   //定义3个缓冲轨中队尾元素所在位置,因为要和前一个比较,所以需要多一个位置
	int front_track_number[3] = { 8,8,8 };  //定义3个缓冲队列队头元素所在位置
	int three_track[3][10] = { 0 };         //将三个缓冲轨道都初始化为零
	int train[9] = {5,8,1,7,4,2,9,6,3};     //定义将要重排的火车车厢序号
	vector<int>reorder_train;               //声明出轨的火车序号
	while (order!=10) {                     //当将要排的火车车厢序号已经达到9时即已经排完结束循环
		if (train[train_number] == order) {     //当入轨队列队头元素和需要排的火车车厢序号相等时
			reorder_train.push_back(train[train_number]);  //塞给出轨队列
			train_number--;                    //入轨队列的队头元素后移
			order++;                           //将要排的火车车厢号加一
		}
		for (int i = 0; i < 3; i++) {         //遍历三个缓冲轨道队列队头元素,
			if (three_track[i][front_track_number[i]] == order) {   //  当前缓冲轨道队列队头元素如果等于将要排的火车车厢序号
				reorder_train.push_back(three_track[i][front_track_number[i]]);//加入出轨队列
				order++; front_track_number[i]--;               //将要排的火车车厢号加一,当前缓冲轨道队头元素后移
			}
		}
		for (int i = 0; i < 3; i++) {        //当入轨队列队头元素不等于order时,需要将其压入其他的三个缓冲队列中
			if (rear_track_number[i] >=0&&train[train_number]>three_track[i][rear_track_number[i]]) {//当当前缓冲队列没有塞满且入轨队头元素大于当前
				three_track[i][rear_track_number[i]-1] = train[train_number];  //缓冲队列队尾元素时
				rear_track_number[i]--; train_number--;
				break;
			}
			if (rear_track_number[0] < 0 && rear_track_number[1] < 0 && rear_track_number[2] < 0) {//如果入轨队列头元素都小于所有的缓冲队列队尾元素时则无法进行
				cout << "没有解决的方法!" << endl;                                                                                 //重排的操作
				system("pause");
				return 0;
			}
		}
	}
	for (auto c = reorder_train.begin(); c != reorder_train.end(); c++) {
		cout << *c << endl;           //打印出轨元素;
	}
	system("pause");
	return 0;

}

结果如下:

发布了37 篇原创文章 · 获赞 12 · 访问量 9275

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/88903271
今日推荐