http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。其实也就是输出所有可能的出栈序列。

样例输入:

3

1 2 3

样例输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 2 1




解答:

  其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了。那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个、1个、2个……栈.size()个,然后把第K个入栈,再对于 K+1个同样实施这样的方法——这就是个递归了。

  出去了的保存在一个队列里面,没出站的保存在栈里面,最后一辆车处理完了递归结束并输出。

代码:

  1. #include <iostream>
  2. #include <vector>
  3. #include <stack>
  4.  
  5. using namespace std;
  6.  
  7. #define DEBUG
  8.  
  9. int n = ;
  10. int* pArr = NULL;
  11.  
  12. void handle(const int index, stack<int> s, vector<int> v)
  13. {
  14. //对于每一个待处理的数字,先处理栈里面的,再处理这个数字
  15. for (int i = s.size(); i >=; i--)
  16. {
  17. //栈里面的数字可以出来 [0个, 全部],出来的就放到了vector里面待输出了
  18. stack<int> sTemp(s);
  19. vector<int>vTemp(v);
  20.  
  21. //从栈里面出 i 个到队列里面去
  22. for (int j = ; j <= i; j++)
  23. {
  24. int top = sTemp.top();
  25. sTemp.pop();
  26. vTemp.push_back(top);
  27. }
  28.  
  29. //再处理这个,把它放到栈顶
  30. sTemp.push(pArr[index]);
  31.  
  32. if (n - == index)
  33. {
  34. //输出结果
  35. static bool isFirst = true;
  36. vector<int> vRes;
  37. if (!isFirst)
  38. cout << endl;
  39.  
  40. for (int i = ; i < vTemp.size(); i++)
  41. vRes.push_back(vTemp[i]);
  42.  
  43. while (!sTemp.empty())
  44. {
  45. int top = sTemp.top();
  46. sTemp.pop();
  47. vRes.push_back(top);
  48. }
  49.  
  50. int i = ;
  51. for (i = ; i < vRes.size() - ; i++)
  52. cout << vRes[i] << " ";
  53. cout << vRes[i];
  54. isFirst = false;
  55. }
  56. else
  57. {
  58. //递归处理
  59. handle(index + , sTemp, vTemp);
  60. }
  61. }
  62. }
  63.  
  64. int main(void)
  65. {
  66. cin >> n;
  67. pArr = new int[n];
  68.  
  69. for (int i = ; i < n; i++)
  70. cin >> pArr[i];
  71.  
  72. stack<int> s;
  73. vector<int> v;
  74. handle(, s, v);
  75.  
  76. delete[] pArr;
  77.  
  78. #ifdef DEBUG
  79. while (true)
  80. cin.get();
  81. #endif
  82. }

第35、36行的变量只是为了输出格式。




总结:

  类似于这种的题目有时候只要根据它的情况模拟一下就知道解决思路了。

华为OJ—火车进站(栈,字典排序)的更多相关文章

  1. 华为OJ:火车进站

    火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...

  2. C++ HOJ 火车进站

    [问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入:   有多组 ...

  3. 【火车出栈】ZOJ - 2603 Railroad Sort

    好久没写递归了,怕手生再来练练手. 题意:车轨上有上图所示的n个中转栈,现有2n个列车,给出列车初始编号序列.列车从最右边驶入车轨,并且列车只能从右向左移动,要求给出列车中转操作序列,使列车经过这n个 ...

  4. CodeVS3958 火车进站

    3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master         题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路 ...

  5. C# 字典排序Array.Sort

    Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array ...

  6. python 字典排序 关于sort()、reversed()、sorted()

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

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

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1022 Problem Description As the new term comes, ...

  8. 在华为oj的两个月

    一次偶然的机会,我接触到华为oj平台(http://career-oj.huawei.com/exam/camLogin.jsp),当时的心情很是兴奋,于是立马注册开通,然后迫不及待地上去做题.刚开始 ...

  9. <转>python字典排序 关于sort()、reversed()、sorted()

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

随机推荐

  1. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  2. ICE中间件说明文档

    ICE中间件说明文档 1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         ...

  3. WebBrowserControl

    Before navigating the URL, write meta into webbrowser's documenttext property as follows: //Setting ...

  4. How to push your code in git

    1. display all the branches git branch -a 2. delete branches git br -d <branch> # 删除某个分支 git b ...

  5. clipse在编写JSP时没有代码提示

    alt /不会出提示按照下面步骤做 1.菜单window- >Preferences- >Java- >Editor- >Content Assist- >Enable ...

  6. DimDate

    CREATE TABLE [dbo].[DimDate]( [DateKey] int NOT NULL , [FullDate] DATE NOT NULL , [MonthNumberOfYear ...

  7. Kinect测量人体身高的程序

    对着书上敲得,从中体会kinect骨骼识别与深度识别的原理.大体原理是懂了,但有些细节还没有完全弄明白. using System; using System.Collections.Generic; ...

  8. mysql 怎么登录

    mysql -uroot -p回车后,输入密码,再回车即可.如果自己没有修改的话,默认密码为空.

  9. python 之编码问题详解

    前在一个项目中遇到用post提交一个xml,xml中含有中文,对于单独的py文件,使用urllib2.urlopen完全ok,但在django中使用就一直报编码错误,然后在网上看到这篇文章不错,决定m ...

  10. select into from 和 insert into select 的用法和区别

    select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建.insert ...