next_permutation(start,end),和prev_permutation(start,end)。这两个函数作用是一样的 区别就在于前者求的是当前排列的下一个排列,后一个求的是当前排列的上一个排列。至于这里的“前一个”和“后一个”
函数头文件
bool next_permutation(iterator start,iterator end)
这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头。
这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。
车站示意如图:
出站<—— <——进站
|车|
|站|
|__|
现在请你按《字典序》输出前20种可能的出栈方案。
输入格式
输入一个整数n,代表火车数量。
输出格式
按照《字典序》输出前20种答案,每行一种,不要空格。
数据范围
1≤n≤20
输入样例:
3
输出样例:
123
132
213
231
321
//
// Created by Admin on 2020/8/19.
//
/*
* acwing 129 火车进站问题
* 这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头。
* 这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
* 也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。
* 车站示意如图:
* 出站<—— <——进站
* |车|
* |站|
* |__|
*
*
*/
/*
* next_permutation(start,end),和prev_permutation(start,end)。这两个函数作用是一样的
* 区别就在于前者求的是当前排列的下一个排列,后一个求的是当前排列的上一个排列。至于这里的“前一个”和“后一个”
* bool next_permutation(iterator start,iterator end)
*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int n,cnt=20;
vector<int> state1;
stack<int> state2;
int state3=1;
void dfs()
{
if(!cnt) return;
// 输出结果
if(state1.size()==n)
{
cnt--;
for(auto x:state1) cout<<x;
cout<<endl;
return;
}
// 要输出的前提条件是 辅助栈不为空
// 保证dfs 序列 需要先进行弹出操作,然后进行压入操作
if(state2.size())
{
state1.push_back(state2.top());
state2.pop();
dfs();
// 恢复现场
state2.push(state1.back());
state1.pop_back();
}
if(state3<=n)
{
state2.push(state3);
state3++;
dfs();
state3--;
state2.pop();
}
}
int main()
{
cin>>n;
dfs();
return 0;
}
## 第二种方法
(1 ) 先生成所有的排列
(2 ) 判断此排列是否符合 栈的出入顺序
(3) 符合则输出结果
(4) 不符合则continue;
#include <algorithm>
#include <queue>
#include <stack>
#include <iostream>
#include <vector>
using namespace std;
int n,cnt;
vector<int> tran;
bool Check()
{
queue<int> que;
stack<int> stk;
// 出队顺序
for(int i=0;i<n;i++)que.push(tran[i]);
// 进出栈顺序
for(int i=1;i<=n;i++)
{
stk.push(i);
while (!stk.empty() && (stk.top() == que.front()))
{
stk.pop();
que.pop();
}
}
return stk.empty();
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
tran.push_back(i);
do{
if(Check())
{
for(int i=0;i<n;i++) cout<<tran[i];
cout<<endl;
cnt++;
if(cnt==20)
break;
}
}while (next_permutation(tran.begin(),tran.end()));
return 0;
}