华为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 ...
随机推荐
- Altiium Designer 09 解决局域网冲突的办法(转载)
Altiium Designer 09 解决局域网冲突的办法(转载) 一 通过防护墙禁止进程访问网络: 1.1打开DXP.EXE,然后在360的流量防护墙或WINDOWS防护墙禁止该进程访问网络.注意 ...
- JAVASE 打印输出--------01
public class Demo01 { public String a1; public int a2; public Demo01(String a, int i) { a1 = a; a2 = ...
- linux 交换分区分配规则
一般地, 内存小于2G ,则swap=2*RAM, 内存大于2G, 则swap=2+RAM, 然后满足上述规则就行.
- awk 两列相减
cat http.txt |awk -F ':' '{print($2-$3)}' 百度文库
- role在标签中的作用是什么?
html 里面的 role 本质上是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明.通常这种情况出现在一些自定义的组件上,这样可增强组件的可访问性.可用性和可交互性 ...
- spring-aop示例
具体案例放在github上,主要是jar包在上面 https://github.com/guoyansi/spring-aop-example knights.xml <?xml version ...
- A手机等的网络udp广播,收到广播以后回复udp消息
B手机:向A手机发送一条消息,等待A回复 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...
- Hadoop JobHistory
hadoop jobhistory记录下已运行完的MapReduce作业信息并存放在指定的HDFS目录下,默认情况下是没有启动的,需要配置完后手工启动服务. mapred-site.xml添加如下配置 ...
- 读书list
1. TCP/IP 1.1 图解 TCP/IP 1.2 TCP/IP 详解 2. HTTP 2.1 HTTP 权威指南
- Unity Shader : Ghost(残影) v1
前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相 ...