栈和队列_7
一、HZOJ-263
火车进栈
有 n 列火车按 1 到 n 的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
进站的火车编号顺序为 1∼n,现在请你按火车编号从小到大的顺序,输出前 20 种可能的出站方案。
输入:
输入一行一个整数 n。(n≤20)
输出:
输出前 20 种答案,每行一种,不要空格。
样例输入:3
样例输出:
123
132
213
231
321
二、题解
1.引库
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <vector>
using namespace std;
2.代码
1.这道题等于是问全排列中前20种合法的出栈序列
2.使用全排列结果,利用一个栈来模拟,入栈出栈合法,即输出结果
bool isValid(int a[],int n){
stack<int> s;
int x=1;
for(int i=0;i<n;i++){
if(s.empty()||s.top()<a[i]){
while(x<=a[i]) s.push(x),x++;
}
if(s.empty()||s.top()!=a[i]) return false;
s.pop();
}
return true;
}
int main(){
int n,a[25],cnt=20;
cin>>n;
for(int i=0;i<n;i++) a[i]=i+1;
do{
if(isValid(a,n)){
for(int i=0;i<n;i++){
cout<<a[i];
}
cout<<endl;
cnt--;
}
}while(next_permutation(a,a+n)&&cnt);
return 0;
}