火车进站问题的求解——华为OJ高级难度题目

本文详细介绍了如何解决火车进站问题,通过栈结构模拟火车站的中转站,利用递归算法找出所有可能的出站序列,并以字典序排序。程序用C语言编写,使用全局变量和自定义比较函数实现排序,最终在华为OJ平台获得满分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

        关于火车进站问题的描述是这样的:N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。火车进站的序列是固定的,为输入时的序列,火车站有一个中转站是栈结构(先进后出),每一辆火车进入火车站,可以直接开出火车站,也可以先进入中转站,后面可以再任何时候,选择是否从中转站出来,但应符合出栈的规则。

       一个实例描述:输入数字3代表总共有3辆车,然后输入三个数字,代表入站的火车编号:1 2 3

                                   输出所有的出站序列,并按字典排序从小到大排序:1 2 3   1 3 2    2 1 3   2 3 1  3 2 1

二、问题分析

         最开始看到这个题目想到做出该题目的第一步,是要能够写出一个程序,可以在给定入站序列的情况下,输出所有的出站序列,其实该问题的核心就是解决任意序列入栈,有多少种出栈序列。然后题目要求按字典排序,这里就可以将所有的出站序列都找到后,然后执行一次排序算法就可以。在解决字典排序算法时候,本来想采用快速排序来提高算法的效率,后来觉得输入的火车数量不大,就采用了一个简单的插入排序来写的,提交到OJ平台上,算法得到了满分。   

        另外我从节省内存空间角度还想到了一种思维,是否能够在找到所有序列的时候就按照字典排序从小到大找到所有序列,仔细的想了想,觉得这种方式将多种功能放在一起实现,就显得有些复杂,各部分功能不独立,因此后来实现整个问题的解决时,还是采用了上面的方法。即找到的一个出站序列,先保存到数组中,然后再对数组中的数据进行一次排序,最后输出数组的内容即可。


三、程序源代码与代码功能分析

       对一些变量我采用了全局变量来记录,这样方便写程序时候的传值问题。我采用的是整形数据类型来存储数据,也可以采用char类型。因此在最后排序的时候,我自己写了一个compare()函数来对比两个整形数组的字典序大小,功能类似库函数的字符串比较函数strcmp()。另外,这个函数int stackinout(int *s, int snum, int *o, int onum, int i)就是实现找到所有的出站序列,采用的是递归的方式来实现,基本思想是:每次都有一列火车要进入中转站,只要中转站里面火车数量不为0,中转站最外面的火车就可以有两种选择,留在中转站中或者出站,如果中转站没有火车了,且没有火车等待入站,所有在中转站的火车就依次出站。然后采用递归的方式来进行,直到所有的火车都出站即找到一个出站序列。


#include "stdio.h"
int a[10],num=0,r[10000][9],count=0;
int stackinout(int *s, int snum, int *o, int onum, int i);
int compare(int *s,int *d,int num);
int sort(int num);
void main()
{
int i=0,j=0,s[9],o[9];
scanf("%d",&num);
for (;i<num-1;

一列货运列车共有 n 节车厢,每节车厢将停放在不同的车站。假定 n 个车站的编号分别 为 1~n,车厢的编号与它们的目的地相同。货运列车按照从第 n 站至第 1 站的次序经过这 些车站。为了便于从列车上卸掉相应的车厢,必须重新排列车厢,使各车厢从前至后按编号 1~n 的次序排列。当所有的车厢按照这种次序排列时,在每个车站只卸掉最后一节车厢 即可。可以在一个转轨站里完成车厢的重排工作,在转轨站中有一个入轨,一个出轨和k 个缓冲铁轨(位于入轨和出轨之间)。 图 3-1 给出了一个转轨站, 其中有 k=3 个缓冲铁轨 H1,H2 和 H3。开始时,n节车厢的货车从入轨处进入转轨站,车厢重排结束时各车厢按照编号1至编号n的次序从出轨处离开转轨站。在图 3-1(a)中,n=9,车厢从后至前的初始次序为 5,8,1,7,4,2,9,6,3。图 3-1(b)给出按所要求的次序重新排列后的结果。 为了重排车厢,从前至后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足排列的要求的车厢,可以直接把它放到出轨上。如果不是,则把它移动到缓冲铁轨上, 直到按输出次序要求轮到它时才将它放到出轨上。由于缓冲铁轨上车厢的进和出都是在其顶 部进行的,因此缓冲铁轨是按照 LIFO 的方式使用的。在重排车厢过程中,仅允许以下移动:  车厢可以从入轨移动到一个缓冲铁轨的顶部或者出轨上;  车厢可以从一个缓冲铁轨的顶部移动到的出轨上;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值