火车进站问题

import java.util.EmptyStackException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
public class H06 {
/**
* @return
* @给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,
* 一共N辆火车,每辆火车以数字1-9编号。
* 要求以字典序排序输出火车出站的序列号。
*
* 思路:
* 要进站的火车组成队列,排前面的先进
* 车站是个栈,后进,先出
* 出站的火车可以简单的用String存储
* 当进站队列和火车栈都空了的时候火车全部出战,打印出站的序列
* 考虑到字典序,当有车可以出战时,优先出站,然后递归
* 当有车可以进站的时候,进站,然后把结果递归
*
* 本题的递归用tmp保护了现场
*/

public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
int num=cin.nextInt();
Queue<Integer> qToIn = new LinkedList<Integer>();
for (int i = 0; i<num; i++)
{
qToIn.add(cin.nextInt());
}
cin .close();
Stack<Integer> sToOut = new Stack<Integer>();
String out = "";
stationDispatch(qToIn,sToOut,out);
}
public static void stationDispatch(Queue<Integer> qToIn,
Stack<Integer> sToOut,String out)
{
boolean hasqToIn = true;
boolean hassToOut = true;
if (qToIn.peek() == null)
{
hasqToIn = false;
}
try
{
sToOut.peek();
} catch (EmptyStackException e)
{
hassToOut = false;
}
if (! hasqToIn && ! hassToOut )
{
System.out.println(out);
return;
}
if (hassToOut)
{
Queue<Integer> qToInTmp = new LinkedList<Integer>(qToIn);
Stack<Integer> sToOutTmp = (Stack<Integer>)sToOut.clone();
String outTmp=out;
outTmp += sToOutTmp.pop().toString();
stationDispatch(qToInTmp,sToOutTmp,outTmp);
}
if (hasqToIn)
{
Queue<Integer> qToInTmp = new LinkedList<Integer>(qToIn);
Stack<Integer> sToOutTmp = (Stack<Integer>)sToOut.clone();
String outTmp=out;
sToOutTmp.push(qToInTmp.poll());
stationDispatch(qToInTmp,sToOutTmp,outTmp);
}

}

}

时间: 2024-11-04 21:14:19

火车进站问题的相关文章

CodeVS3958 火车进站

3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路,供火车停靠,以便上下客或装载货物.铁路支路有一定长度:火车也有一定的长度,且每列火车的长度相等. 假 设某东西向的铁路上,有一小站.该站只有一条铁路支路可供火车停靠,并且该铁路支路最多能容纳M 辆火车.为了火车行驶的通畅,该站只允许火车自东方进站,自西方出站,且先进站的火车必须先出站,否则,站内火车将发生堵塞.该

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si

(hdu)1022 Train Problem I 火车进站问题

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1022 Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Stati

[华为机试练习题]13.火车进站

题目 描述: 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 题目类别: 栈 难度: 高级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9. 输出: 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample. 样例

全排列——火车进站问题(华为OJ)

今天发现一个非常好用的函数next_permutation(),利用这个函数这以很容易的列出一组数据的所有排列组合. 利用全部排列解决了火车进站问题,下面是题目和源码: 题目:给定一个正整数N代表火车数量,0 #include<vector> #include<stack> #include<string> #include<iostream> #include<algorithm> using namespace std; //////////

C++ HOJ 火车进站

[问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入: 有多组測试用例,每一组第一行输入一个正整数N(0<N<10),第二行包含N个正整数,范围为1到9. 输出: 输出以字典序排序的火车出站序列号,每一个编号以空格隔开,每一个输出序列换行.详细见sample. 例子输入: 3 1 2 3 例子输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 [

栈:火车进站

题目描述 这里有n列火车将要进站再出站-- 但是,每列火车只有1节---那就是车头-- 描述 有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出. (某生:不就是个栈吗?每次可以让右侧头火车进栈,或者让栈顶火车出站? 老师:闭嘴!) 就像这样: 出站<---    <--进站 |车| |站| |__| 现在请你按<字典序>输出前20种可能的出栈方案. 输入 一个

栈之火车进站和出站

Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes

华为机试题 火车进站

描述:给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列 输入: 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9. 输出: 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample. 样例输入: 3 1 2 3 样例输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 思路:先对输入序列进行字