华为机试在线训练-牛客网(36)火车进站
来源:互联网 发布:dior fix it 编辑:程序博客网 时间:2024/05/16 06:08
题目描述
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。
输入描述:
有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。
输出描述:
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
输入例子:
31 2 3
输出例子:
1 2 31 3 22 1 32 3 13 2 1
两个字:好题!
将全排列和栈的应用结合来考。可以先列出所有排列(全排列算法),依次判断是否为输入序列的出栈序列,即输入序列作为入栈序列,判断该排列是否为其一种可能的出栈序列。比如:3 1 2就不是1 2 3的一个出栈序列。难点在于判断一个排列是否是输入序列的出栈序列。
判断一个序列是否是入栈序列的出栈序列的基本思路为:每次入栈后都判断是否需要出栈,具体操作如下:
(1)对于输入序列,每次先入栈,后判断是否需要出栈,出栈条件:栈非空且栈顶元素与出栈序列当前所指元素相等。
(2)每出栈一次,指向出栈序列下一个元素。
(3)重复过程(1),直到输入序列遍历完成。
(4)遍历结束后,若栈空则true,否则false。
代码如下;
bool isPopOrder(int pushNum[],int n,vector<int> popNum){ stack<int> stk; int j=0; for(int i=0;i<n;i++)//依次把push中的数入栈 { stk.push(pushNum[i]); while( stk.size()!=0 && popNum[j]==stk.top()) //依次判断pop序列每个值是否与栈顶相等 { stk.pop(); j++; } } return stk.empty();}
判断出栈序列实现后,主函数就简单了。只需实现全排列算法对每个排列进行判断即可,可以直接调用STL的next_permutation()完成全排列,注意该函数的使用需要先排序才能列出所有排列,详见博客:《STL算法-排列算法》http://blog.csdn.net/hechao3225/article/details/54946510
完整AC的代码:
#include <iostream>#include <algorithm>#include <stack>using namespace std;bool isPopOrder(int pushNum[],int n,vector<int> popNum){ stack<int> stk; int j=0; for(int i=0;i<n;i++)//依次把push中的数入栈 { stk.push(pushNum[i]); while(stk.size()!=0 && popNum[j]==stk.top()) //依次判断pop序列每个值是否与栈顶相等 { stk.pop(); j++; } } return stk.empty();}int main(){ int n; while(cin>>n){ int num; int data[n]; vector<int > temp; for(int i=0;i<n;i++){ cin>>num; data[i]=num; temp.push_back(num); } sort(temp.begin(),temp.end()); vector<vector<int>> vec_res; do{ if(isPopOrder(data,n,temp)) vec_res.push_back(temp); }while(next_permutation(temp.begin(),temp.end())); sort(vec_res.begin(),vec_res.end()); for(auto e:vec_res){ int i=0; for(;i<n-1;i++){ cout<<e[i]<<" "; } cout<<e[i]<<endl; } } return 0;}
1 0
- 华为机试在线训练-牛客网(36)火车进站
- [华为机试练习题]13.火车进站
- 火车进站问题(华为OJ)
- 火车进站 华为oj
- 火车进站-华为OJ
- 华为OJ火车进站
- 【华为OJ】【072-火车进站】
- 【栈】华为OJ:火车进站
- 火车进站 华为oj(转)
- 全排列——火车进站问题(华为OJ)
- 火车进站(栈)
- 华为机试在线训练-牛客网(4)质数因子
- 华为机试在线训练-牛客网(8)句子逆序
- 华为机试在线训练-牛客网(10)坐标移动
- 华为机试在线训练-牛客网(13)简单密码
- 华为机试在线训练-牛客网(16)字符串排序
- 华为机试在线训练-牛客网(22)字符串加密
- 华为机试在线训练-牛客网(24)迷宫问题
- 归档模式下-丢失关键数据文件
- CS1041号错误是什么
- A. Mike and Fax
- Python 函数定义以及参数传递
- DMA Coherent Mapping
- 华为机试在线训练-牛客网(36)火车进站
- 向函数中传递指针和传递指针的引用的区别
- js中几种实用的跨域方法原理详解
- PAT考试大纲
- 100道动态规划——30 UVAlive 3907 Puzzle AC自动机上的动态规划,记忆化搜索
- 在一定相同的条件下合并数据的方式(日期相同的数据合并)
- 《C++Primer》读书笔记(三)字符串、向量、数组
- java时间相加减
- 安装numpy+scipy+matlotlib+scikit-learn及问题解决