华为OJ—火车进站(栈,字典排序)
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个同样实施这样的方法——这就是个递归了。
出去了的保存在一个队列里面,没出站的保存在栈里面,最后一辆车处理完了递归结束并输出。
代码:
#include <iostream>
#include <vector>
#include <stack> using namespace std; #define DEBUG int n = ;
int* pArr = NULL; void handle(const int index, stack<int> s, vector<int> v)
{
//对于每一个待处理的数字,先处理栈里面的,再处理这个数字
for (int i = s.size(); i >=; i--)
{
//栈里面的数字可以出来 [0个, 全部],出来的就放到了vector里面待输出了
stack<int> sTemp(s);
vector<int>vTemp(v); //从栈里面出 i 个到队列里面去
for (int j = ; j <= i; j++)
{
int top = sTemp.top();
sTemp.pop();
vTemp.push_back(top);
} //再处理这个,把它放到栈顶
sTemp.push(pArr[index]); if (n - == index)
{
//输出结果
static bool isFirst = true;
vector<int> vRes;
if (!isFirst)
cout << endl; for (int i = ; i < vTemp.size(); i++)
vRes.push_back(vTemp[i]); while (!sTemp.empty())
{
int top = sTemp.top();
sTemp.pop();
vRes.push_back(top);
} int i = ;
for (i = ; i < vRes.size() - ; i++)
cout << vRes[i] << " ";
cout << vRes[i];
isFirst = false;
}
else
{
//递归处理
handle(index + , sTemp, vTemp);
}
}
} int main(void)
{
cin >> n;
pArr = new int[n]; for (int i = ; i < n; i++)
cin >> pArr[i]; stack<int> s;
vector<int> v;
handle(, s, v); delete[] pArr; #ifdef DEBUG
while (true)
cin.get();
#endif
}
第35、36行的变量只是为了输出格式。
总结:
类似于这种的题目有时候只要根据它的情况模拟一下就知道解决思路了。
华为OJ—火车进站(栈,字典排序)的更多相关文章
- 华为OJ:火车进站
火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...
- C++ HOJ 火车进站
[问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入: 有多组 ...
- 【火车出栈】ZOJ - 2603 Railroad Sort
好久没写递归了,怕手生再来练练手. 题意:车轨上有上图所示的n个中转栈,现有2n个列车,给出列车初始编号序列.列车从最右边驶入车轨,并且列车只能从右向左移动,要求给出列车中转操作序列,使列车经过这n个 ...
- CodeVS3958 火车进站
3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路 ...
- C# 字典排序Array.Sort
Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array ...
- python 字典排序 关于sort()、reversed()、sorted()
一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...
- (hdu)1022 Train Problem I 火车进站问题
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1022 Problem Description As the new term comes, ...
- 在华为oj的两个月
一次偶然的机会,我接触到华为oj平台(http://career-oj.huawei.com/exam/camLogin.jsp),当时的心情很是兴奋,于是立马注册开通,然后迫不及待地上去做题.刚开始 ...
- <转>python字典排序 关于sort()、reversed()、sorted()
一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...
随机推荐
- View的缩放操作--CGAffineTransformMakeScale:
__weak UIImageView *weekImage = imageView; imageView.transform = CGAffineTransformMakeScale(0.1, 0.1 ...
- Echarts-地图扩展-标准geoJson格式扩展地图-例子
本人菜鸟一枚,最近搞echarts地图.看到官方给的“标准geoJson格式扩展地图-全国主要城市”的例子,瞬间就蒙逼了.不怪人官网的例子不好,实在是我看不懂它是怎么弄得.最后折腾了一晚上,最后终于弄 ...
- 89、Android EditText 悬浮停靠
package com.willen.topFloatDemo; import android.content.Context; import android.os.Handler; import a ...
- (DP)MaxSubArr
public static int MSA(int[] ar) { int[] arr = new int[ar.length]; int msa = 0; arr[0] = ar[0]; for ( ...
- gnu c语言中的?:的作用
#include <stdio.h> #include <stdlib.h> char * test() { return "abc" ?: "f ...
- SVN-服务器搭建、apache2整合、eclipse使用
如题,分成3个部分: 1.SVN服务器搭建.操作系统Ubuntu 14.04.2 LTS.具体方法度娘很多,不再细数. 安装:sudo apt-get install subversion 创建版本库 ...
- 使用MonkeyTest对Android客户端进行压力测试 自动化代码
1.monkey命令简介 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...
- git克隆项目到一个非空目录
这只是记录: 1. 进入非空目录,假设是 /workdir/proj1 2. git clone --no-checkout https://git.oschina.net/NextApp/platf ...
- Flex开发自定义控件
前期准备: 点击File菜单 -> New -> MXML Component,然后弹出一个对话框. 在对话框中输入组件名,选择此组件继承的类型,如:Canvas,DataGrid,Com ...
- only one is important
今天早上还是去了图书馆,看了一早上的hello world(intel opencl),清楚了程序编写的基本流程,但是,仍和以前一样,貌似看懂了,其实什么也不会,没有发现什么问题.中午,回来取了我的笔 ...