火车进站(全排列+栈的弹出压进序列)
给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号,火车站只有一个方向进出,同时停靠在火车站的列车中,只有后进站的出站了,先进站的才能出站。
要求输出所有火车出站的方案,以字典序排序输出。
数据范围:1\le n\le 10\1≤n≤10
进阶:时间复杂度:O(n!)\O(n!) ,空间复杂度:O(n)\O(n)
输入描述:
第一行输入一个正整数N(0 < N <= 10),第二行包括N个正整数,范围为1到10。
输出描述:
输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。
示例1
输入:
3 1 2 3
复制输出:
1 2 3 1 3 2 2 1 3 2 3 1 3 2 1
复制说明:
第一种方案:1进、1出、2进、2出、3进、3出 第二种方案:1进、1出、2进、3进、3出、2出 第三种方案:1进、2进、2出、1出、3进、3出 第四种方案:1进、2进、2出、3进、3出、1出 第五种方案:1进、2进、3进、3出、2出、1出 请注意,[3,1,2]这个序这个序列是不可能实现的。
#include<bits/stdc++.h>using namespace std;
const int n=10;
int a[n],N;
bool b[n];
vector<vector<int>> res;
vector<int> path;void dfs(int x)
{if(x==N){for(int i=0;i<N;i++){path.push_back(a[i]);}res.push_back(path);path.clear();return ;}for(int i=1;i<=N;i++){if(!b[i]){a[x]=i;b[i]=true;dfs(x+1);b[i]=false;}}
}int main()
{cin>>N;int c[n];for(int i=0;i<N;i++)cin>>c[i];dfs(0);vector<vector<int>> prt;for(int j=0;j<res.size();j++){stack<int> than;vector<int> tmp=res[j];for(int i=0,z=0;i<N;i++){than.push(c[i]);while(!than.empty()&&than.top()==tmp[z])than.pop(),z++;}if(than.empty())prt.push_back(tmp);}for(auto i:prt){for(auto j:i)cout<<j<<' ';cout<<endl;}return 0;
}
火车进站(全排列+栈的弹出压进序列)相关推荐
- 复习栈和队列,详解最小栈,栈的弹出压入序列,逆波兰表达式求值
栈和队列的概念 栈:吃进去吐出来 对列:吃进去拉出来 数据结构中的栈和内存中的区别 数据结构中的栈具有后进先出的特性,而内存中的栈是一个内存空间,只不过这个内存空间具与数据结构的栈具有相同的特性. 栈 ...
- java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)
1.题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...
- 《剑指offer》:[22]如何判断一个序列是否为栈的弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列 ...
- 栈的弹出函数pop()实现方案探讨
多日前,我在blog发表了对<多任务下的数据结构与算法>一书的评论,在与作者的探讨中,我们就栈的弹出函数设计有比较大的分歧,详见http://blog.csdn.net/lanphaday ...
- 栈的压入、弹出序列和栈所有可能的弹出顺序
题目:输入两个整数序列,第一序列表示栈的压入顺序(假设没有相同的整数值),判断第二个序列是否为该栈弹出顺序.经典的一个笔试题目. #include <iostream> #include ...
- 剑指offer:面试题31. 栈的压入、弹出序列
题目:栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 ...
- 剑指offer22:栈的压入、弹出序列
题意: 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2, ...
- 举例让抽象问题具体化:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一 ...
- 【数据结构】栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等,例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序列 ...
最新文章
- html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
- Spark的RDD行动算子
- C#中的get和post请求(工具类)
- PHP probuf详细步骤_初识protobuf和php的相关用法
- zend studio常见问题解答
- 如何测试一个电梯,测试方案及测试用例
- Ubuntu Server安全Webserver搭建流程
- Linux操作Oracle(11)——Oracle用户密码过期 设置密码永不过期方法
- 有关二级菜单缓慢效果出现(transition)
- 正式开始学习GO语言
- windows网络编程 gethostbyname()
- Python 爬取zw年鉴
- 《Using OpenRefine》翻译~17
- 图解PKCS#1——第五部分 附录Mask generation functions MGF1
- Python全套视频
- 工商银行u盾 java_中国工商银行u盾怎么用
- Shelve Silently - 静默搁置 (Git 功能)
- 阿里云服务器开放端口的正确方式(超详细图文教程)
- 微信小程序开发之——文件上传
- matlab 图像卷积的方法与应用