火车车厢重排问题,C++详解

目录

实验题目

解题思路

1先看缓冲队列队头是否符合要求

2看队头元素是否符合要求

完整代码

 运行结果


实验题目

火车车厢重排问题

实验说明:转轨站示意图如下:

火车车厢重排过程如下:

火车车厢重排算法伪代码如下:

解题思路

        这是一看就是一道模拟题,主要是根据题目给出的伪代码实现对应的过程,要求比较强的代码复现能力与调试能力。

        一共需要4个队列,一个是入轨的队列。还有三个缓冲队列,具体过程为先拿出入轨队列的第一个元素,如果是1的话就说明要出队作为结果,如果不是就要放入缓冲队列,然后再从入轨里拿队员。

        关键来了,后面要找出缓冲队列中队尾元素小于我们拿出来的这个值的元素,然后找到这几个元素的最大值,然后把从入轨中拿出的那个元素放入那个队列中

        这么说有点抽象,看我的代码即可(有详细注释)。

        我采用的是一个纯暴力的做法,直接用一个大小为3的数组初始值为0。

	//如果不是要出列的考虑放入某个缓冲队列的队尾//方法是找到这三个缓冲队列中队尾小于x的数,这些数里最大的那个数所在的队列就是x要入的队列int a[4];a[0] = 0,a[1] = 0,a[2] = 0,a[3] = 0;//初始化都为0,这里a【0】是多余的if(!line1.empty() && line1.back() < x) {a[1] = line1.back();}if(!line2.empty() && line2.back() < x) {a[2] = line2.back();}if(!line3.empty() && line3.back() < x) {a[3] = line3.back();}//再找这三个数里最大的那个if(a[1] > a[2] && a[1] > a[3]) {line1.push(x);}if(a[2] > a[1] && a[2] > a[3]) {line2.push(x);}if(a[3] > a[1] && a[3] > a[2]) {line3.push(x);}//如果都为0随便找个空队列放着if(a[1] == 0 && a[2] == 0 && a[3] == 0) {if(line1.empty()) {line1.push(x);}else if(line2.empty()) line2.push(x);else if(line3.empty()) line3.push(x);}

具体顺序为

1先看缓冲队列队头是否符合要求

	//第一步开始考察每一个缓冲队列//如果队列不为空并且头元素恰好是要出列的那个就出列if(!line1.empty() && line1.front() == nowout) {cout << line1.front();nowout++;line1.pop();continue;//满足条件就直接进行下一次循环}if(!line2.empty() && line2.front() == nowout) {cout << line2.front();nowout++;line2.pop();continue;}if(!line3.empty() && line3.front() == nowout) {cout << line3.front();nowout++;line3.pop();continue;}

2看队头元素是否符合要求

	if(x == nowout) {cout << x;nowout++;continue;//此时入轨的那个数满足条件了,直接进行下一次循环}

3如果队头元素不符合就按照上面的要求放入缓冲队列

完整代码

#include<iostream>
#include<queue>
using namespace std;void renewline(queue<int> line)
{queue<int> line1, line2, line3;//三个缓冲轨道int nowout = 1;//表示要出列的车厢,也表示排好的车厢数目,总共9个车厢排到第9个表示排完了while (nowout != 10){//这里nowout是要不为10,是因为当它为9时9还在缓冲队列里,等9出列后nowout变为10,此时才代表队列都为空了//第一步开始考察每一个缓冲队列//如果队列不为空并且头元素恰好是要出列的那个就出列if(!line1.empty() && line1.front() == nowout) {cout << line1.front();nowout++;line1.pop();continue;//满足条件就直接进行下一次循环}if(!line2.empty() && line2.front() == nowout) {cout << line2.front();nowout++;line2.pop();continue;}if(!line3.empty() && line3.front() == nowout) {cout << line3.front();nowout++;line3.pop();continue;}//第二步再看入轨的队头元素是不是要出列的//要注意入轨不能为空int x;if(!line.empty()) {x = line.front();line.pop();}if(x == nowout) {cout << x;nowout++;continue;//此时入轨的那个数满足条件了,直接进行下一次循环}else {//如果不是要出列的考虑放入某个缓冲队列的队尾//方法是找到这三个缓冲队列中队尾小于x的数,这些数里最大的那个数所在的队列就是x要入的队列int a[4];a[0] = 0,a[1] = 0,a[2] = 0,a[3] = 0;//初始化都为0,这里a【0】是多余的if(!line1.empty() && line1.back() < x) {a[1] = line1.back();}if(!line2.empty() && line2.back() < x) {a[2] = line2.back();}if(!line3.empty() && line3.back() < x) {a[3] = line3.back();}//再找这三个数里最大的那个if(a[1] > a[2] && a[1] > a[3]) {line1.push(x);}if(a[2] > a[1] && a[2] > a[3]) {line2.push(x);}if(a[3] > a[1] && a[3] > a[2]) {line3.push(x);}//如果都为0随便找个空队列放着if(a[1] == 0 && a[2] == 0 && a[3] == 0) {if(line1.empty()) {line1.push(x);}else if(line2.empty()) line2.push(x);else if(line3.empty()) line3.push(x);}}}
}int main()
{queue<int> line;int x;while (1){cin >> x;if(x == 0) break;//当输入为0时输入停止line.push(x);//入轨道时的车厢编号顺序}cout << "排好后的车厢顺序为:";renewline(line);return 0;
}

 运行结果

输入我采用的是题目给的数据,当输入0时就代表输入停止。

以上是运行结果截图,按照要求输出了正确的顺序。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法学习第一弹——C++基础

早上好啊&#xff0c;大佬们。来看看咱们这回学点啥&#xff0c;在前不久刚出完C语言写的PTA中L1的题目&#xff0c;想必大家都不过瘾&#xff0c;感觉那些题都不过如此&#xff0c;所以&#xff0c;为了我们能更好的去处理更难的题目&#xff0c;小白兔决定奋发图强&#xff0…

LabVIEW大数据处理

在物联网、工业4.0和科学实验中&#xff0c;大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言&#xff0c;凭借其强大的数据采集和分析能力&#xff0c;广泛应用于实时数据处理和控制系统中。然而&#xff0c;在面对大数据处理时&#xff0c;LabVIEW也存在一些注意事项。…

AUTOSAR_EXP_ARAComAPI的7章笔记(3)

☞返回总目录 相关总结&#xff1a;AutoSar AP简单多绑定总结 7.3 多绑定 如在 5.4.3 小节中简要讨论的&#xff0c;某个代理类 / 骨架类的不同实例之间的技术传输是不同的&#xff0c;多绑定描述了这种情况的解决方案。多种技术原因都可能导致这种情况出现&#xff1a; 代…

一键生成本地SSL证书:打造HTTPS安全环境

一键生成本地SSL证书&#xff1a;打造HTTPS安全环境 日光下的寒林没有一丝杂质&#xff0c;空气里的冰冷仿佛来自故乡遥远的北国&#xff0c;带着一些相思&#xff0c;还有细微几至不可辨认的骆驼的铃声。–《心美&#xff0c;一切皆美》 在本地开发环境中启用 HTTPS 一直是许多…

mysql 配置文件 my.cnf 增加 lower_case_table_names = 1 服务启动不了的原因

原因&#xff1a;在MySQL8.0之后的版本&#xff0c;只允许在数据库初始化时指定&#xff0c;之后不允许修改了 mysql 配置文件 my.cnf 增加 lower_case_table_names 1 服务启动不了 报错信息&#xff1a;Job for mysqld.service failed because the control process exited …

Zookeeper的安装与使用

一、简介 1.1、概念 ZooKeeper 是一个开源的分布式协调服务&#xff0c;主要用于解决分布式系统中的数据一致性问题。它提供了一种可靠的机制来管理和协调分布式系统的各个节点。ZooKeeper 的设计目标是简化分布式应用的开发&#xff0c;提供简单易用的接口和高性能、高稳定性…

Vue3.js - 一文看懂Vuex

1. 前言 Vuex 是 Vue.js 的官方状态管理库&#xff0c;用于在 Vue 应用中管理组件之间共享的状态。Vuex 适用于中大型应用&#xff0c;它将组件的共享状态集中管理&#xff0c;可以避免组件间传递 props 或事件的复杂性。 2. 核心概念 我们可以将Vuex想象为一个大型的Vue&…

图论-代码随想录刷题记录[JAVA]

文章目录 前言Floyd 算法dijkstra&#xff08;朴素版&#xff09;最小生成树之primkruskal算法 前言 新手小白记录第一次刷代码随想录 1.自用 抽取精简的解题思路 方便复盘 2.代码尽量多加注释 3.记录踩坑 4.边刷边记录&#xff0c;更有成就感&#xff01; 5.解题思路绝大部分来…

《Python网络安全项目实战》项目5 编写网站扫描程序

《Python网络安全项目实战》项目5 编写网站扫描程序 项目目标&#xff1a;任务5.1 暴力破解网站目录和文件位置任务描述任务分析任务实施相关知识任务评价 任务5.2 制作网页JPG爬虫任务分析任务实施相关知识任务评价任务拓展 WEB网站安全渗透测试过程中需要进行目录扫描和网站爬…

时序论文20|ICLR20 可解释时间序列预测N-BEATS

论文标题&#xff1a;N-BEATS N EURAL BASIS EXPANSION ANALYSIS FOR INTERPRETABLE TIME SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/pdf/1905.10437.pdf 前言 为什么时间序列可解释很重要&#xff1f;时间序列的可解释性是确保模型预测结果可靠、透明且易…

硬件工程师之电子元器件—二极管(4)之热量对二极管温度特性的影响

写在前面 本系列文章主要讲解二极管的相关知识,希望能帮助更多的同学认识和了解二极管。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 二极管 7. 热量对二极管温度特性的影响 半导体器件的电气特性通常对环境温度和工作结温敏感。 Si二极管的特性在工作范围内通常如下…

Java算法OJ(7)随机快速排序

目录 1.前言 2.正文 1. 快速排序的基本原理 2. 随机快速排序的改进 3. 随机快速排序的步骤 3.小结 1.前言 哈喽大家好吖&#xff0c;今儿给大家带来算法—随机快速排序相关知识点&#xff0c;废话不多说让我们开始。 2.正文 在了解随机快排之前&#xff0c;先了解一下…

基于 Python Django 的二手房间可视化系统分析

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种架构模式&#xff0c;广泛应用于现代前端开发&#xff0c;尤其是在微软的WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中。它旨在通过将视图&#xff08;UI&#xff09;与业务逻辑&#xff08;…

如何进行产线高阶能耗数据的计算和可视化?

一、前言 在当前经济下行时期&#xff0c;越来越来多企业开始对产线进行数字化转型&#xff0c;提高企业竞争力。在产线数字化转型过程中&#xff0c;产线高阶能耗数据的计算和可视化是比较重要的一环&#xff0c;今天小编就和大家分享如何对产线能耗数据进行计算和可视化。 …

亲测有效:Maven3.8.1使用Tomcat8插件启动项目

我本地maven的settings.xml文件中的配置&#xff1a; <mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url> </mirror>…

开源项目推荐——OpenDroneMap无人机影像数据处理

实景三维作为GIS最火的课题&#xff0c;最近在想做一套自己的三维构建工具&#xff0c;考察了几个开源项目&#xff0c;把自己的搜索过程用csdn记录下来&#xff0c;希望也能帮助到各位同仁。 OpenDroneMap&#xff08;ODM&#xff09;是一个开源项目&#xff0c;旨在处理无人…

蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 搜索与查找 一、九宫格 【问题描述】 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三 …

Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解

title: Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解 date: 2024/11/14 updated: 2024/11/14 author: cmdragon excerpt: schema:beforeWrite 钩子是 Vite 提供的一个功能强大的生命周期钩子,允许开发者在 JSON Schema 被写入之前执行自定义操作。利用这个钩子,您可以…

当你想要conda安装遇到UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel的问题

想要装个虚拟环境&#xff0c;结果遇到404。 看了第一个GitHub帖子中的一句话 UnavailableInvalidChannel: The channel is not accessible or is invalid. Navigator not launching. Issue #9473 conda/conda GitHub 想说那我就把这个not found的channel删掉吧&#xff…