数据结构和算法:火车进出站
内卷之源:
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109?tpId=37&&tqId=21300&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking
题目描述:
* 给定一个正整数N代表火车数量,0<N<10
* 接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1~9编号
* 火车站进出口是同一个,因此停在火车站的列车,只有后进站的出站了,先进站的才能出站——FILO
* 要求输出火车出站的所有方案,并按字典序排序输出 —— 指方案之间的顺序
* 备注:(1)有多组测试用例,每组第一行输入一个正整数N,第二行输入火车入站的序列。
* (2)各出站方案按字典序排序,换行输出,组成各方案的编号以空格间隔。
测试用例:
Input | Output |
3 1 2 3 //只是进站顺序 |
1 2 3 //1进、1出、2进、2出、3进、3出 1 3 2 //1进、1出、2进、3进、3出、2出 2 1 3 //1进、2进、2出、1出、3进、3出 2 3 1 //1进、2进、2出、3进、3出、1出 //3 1 2 是不可能存在的,因为其要求:1进、2进、3进、3出、1出、2出 3 2 1 //1进、2进、3进、3出、2出、1出 |
4 2 1 4 3 |
1 2 3 4 //2进、1进、1出、2出、4进、3进、3出、4出 1 2 4 3 //2进、1进、1出、2出、4进、4出、3进、3出 //1 3 2 4 是不可能存在的,因为其要求:2进、1进、1出、4进、3进、3出、2出、4出 1 3 4 2 //2进、1进、1出、4进、3进、3出、4出、2出 ……(共14种) |
7 6 1 5 3 2 7 4 |
1 2 3 4 7 5 6 1 2 3 5 4 7 6 1 2 3 5 6 4 7 1 2 3 5 6 7 4 1 2 3 5 7 4 6 ……(共429种) |
思路分析:
仔细观察表格Output列各方案会发现,在前一辆进站后,下一辆只有两种选择:一是在前一辆出站前完成进站并出站;二是在前一辆出站后完成进站并出站,但此情景还必须考虑上一辆之前是否还有未出站的车辆。按照FILO后续车辆依次类推即可。
表格Output列各序列中同一编号第一次出现代表进站,第二次出现代表出站。因此基于完整的进出站序列,按照重复编号第二次出现的位置依次读取,然后进行排序即可。
编程实现(C++):
/************************************************************** @author SLF* @version V1.0.0* @date 28-Jun-2021*************************************************************/#include <iostream>
#include <vector>
#include <set>
#include <string>using namespace::std;int main(void)
{int N = 0; //0<N<10int n = 0;char pre = 0; //上一辆char in[9] = { 0 }; //入站序列string str;vector<string> vct; //方案组合set<string> set_vct; //方案排序int i = 0, j = 0;int num = 0, p = 0; //num:累计的在上一辆之前入站且还未出站的车辆数int len = 0, len2 = 0;unsigned int pos = 0;scanf("%d", &N);/*** 生成所有方案 ***/for (i = 0; i < N; ++i){//火车编号0~9,为了方便搜索、插值,转为字符串处理起来更方便(局限性:不适于编号大于9)scanf("%d", &n);in[i] = n + ('0' - 0);if (vct.empty()){//第一辆pre = in[i];str.append(2, pre);vct.push_back(str);continue;}//当前车辆进出站只能是:// (1)在上一辆出站前 ———— 最简单// (2)在上一辆出站后 ———— 还需考虑上一辆之前是否有入站且还未出站的车辆,如有,则当前车辆进出站必须是在那些车辆出站前或出站后for (num = 0, j = 0, len = vct.size(); j < len; ++j){//cout << "size: " << vct.size() << endl;//用于生成新方案str = vct[j];len2 = vct[j].size();//上一辆的进出站编号存放位置总是连续的:进站在前,出站紧跟在后pos = vct[j].rfind(pre);//(1)在上一辆出站前vct[j].insert((vct[j].begin() + pos), 2, in[i]);//(2)在上一辆出站后for (p = 1 + pos; p <= len2; ++p, ++num) //如果(1 + pos) < len2,则上一辆之前还有入站且还未出站的车辆{vct.push_back(str); //新的方案vct[len + num].insert((vct[len + num].begin() + p), 2, in[i]);}}pre = in[i];}// cout << endl << "total: " << vct.size() << endl;/*** 先删各方案进站编号,然后再排序 ***/for (j = 0, len = vct.size(); j < len; ++j){//cout << vct[j] << endl;for (i = 0; i < N; ++i){// vct[j].replace(vct[j].find(in[i]), 1, " "); //不得行!!!vct[j].erase(vct[j].find(in[i]), 1); //删除第一次出现的编号(进站)}}/*** 利用有序容器自动排序,然后输出 ***/set_vct.insert(vct.cbegin(), vct.cend());for (auto& iter : set_vct){for (i = 0; i < (N - 1); ++i){cout << iter[i] << ' ';}cout << iter[i] << endl;}return 0;
}
编程实现(C):
//TODO...
郑重提示:①解题思路非最优,覆盖条件可能不全,仅供练习参考。
②若有更佳思路或疑问,可在评论区留言相互讨论,不亦乐乎。
③本文不允许转载,若认可本文,可点赞收藏关注。
数据结构和算法:火车进出站相关推荐
- 数据结构栈之火车出站小结
这周遇到此题,做个小结. 解题步骤 1.凝练题目 1~n进入A,判断输入序列是否满足出栈规则 2.解决方案 添加C栈,将输入编号逐个与A中元素比较:若相同,出栈,不相同,将编号压入C栈:出站车厢数等于 ...
- 栈模拟火车进出站Java
import java.util.*;/*** 数组全排列 栈运算进出* @author Green.Gee* @date 2022/12/5 13:07* @email green.gee.lu@g ...
- C语言编写程序火车出站,火车进出站问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include using namespace std; typedef struct Stack ...
- 数据结构和算法概述及算法分析
一.数据结构和算法概述 B站学习视频 1.1首先我们为什么要学习数据结构? 数据结构和算法这门课程无论在哪个学校的计算机专业,都是一门必修课,因为这门课程非常重要的,是编程必备的基础,但是这门课程是一 ...
- 数据结构与算法——绪论
前言:数据结构与算法是计算机科学与工程的基础,它们的相互关系和作用是程序的本质.凭借一句话获得图灵奖的Pascal之父Nicklaus Wirth把它们表示为 算法+数据结构=程序 目录: 1.算法与 ...
- 【图解数据结构与算法】视频教程正式上线B站,持续更新中......
本主[图解数据结构与算法(Java语言描述)] B站传送门 https://www.bilibili.com/video/BV1ea4y1e7v7/
- Datawhale组队学习:数据结构与算法课程任务
背景 Datawhale 是国内很有名的一个开源学习组织.这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起,营造出一种互促高效的学习环境,一起为开源学习付出努力. Datawhale ...
- 【数据结构与算法】7.位图算法、12306抢票算法
前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥,一个每天爬二十六层楼还不忘读源码的硬核男人. 相信大家都有过抢票.刷票的经验,每年年底, ...
- 数据结构于算法—线性表
目录 前言 线性表基本架构 顺序表 插入 删除 其他操作 链表 基本结构 插入 带头节点与不带头节点 插入尾 删除 其他 代码实现 顺序表 链表 测试与结果 总结 原创公众号:bigsai 文章收藏在 ...
最新文章
- 在边缘AI与云AI之间寻找平衡
- 电脑罗盘时钟代码_苹果电脑怎么设置数字时钟屏保 Word Clock for Mac安装教程
- cmos逻辑门传输延迟时间_CMOS和TTL都有哪些区别?图腾柱电路又是什么,详情进来一瞧!...
- C++设计模式-建造者模式
- 转:Openflashchart笔记
- 二级缓存使用步骤_Mybatis的一级缓存和二级缓存的理解以及用法
- 你敢信?FBI 的190万条恐怖分子监控名单竟无密码保护且不慎遭暴露
- 机器学习笔记(二十一):决策边界
- ios 设置按钮不可见_ios开发中button控件的属性及常见问题
- IBM ThinkPad SL400 XP驱动
- 单片机原理及应用程序c语言版题库,单片机原理及应用期末复习题库(含答案)...
- 图片、照片相似度批量对比
- matlab均值量化函数_Matlab量化函数quantiz解析
- 风险偏好情绪提振,欧元低位延续反弹
- 用H5新特性canvas绘制一个钟表
- 通过nodejs 服务器读取HTML文件渲染到页面
- 大数据揭秘区块链人才大迁徙:那个你身边悄悄离职的人去哪儿了?
- 动态规划——贴纸拼词
- grep 不区分大小写_使用不区分大小写的Grep
- 硕士研究生毕业论文检测加强通过率的四大方法