1095: 火车出站
时间限制: 1 Sec 内存限制: 32 MB
提交: 39 解决: 23
[提交][状态][讨论版][命题人:外部导入]
题目描述
铁路进行列车调度时,常把站台设计成栈式结构的站台,试问:
设有编号为1到n的n辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?
输入
输入包含多组测试数据。每组为一个正整数n(1<=n<=20),表示有n辆列车。
输出
输出可能的出栈序列有多少种。
样例输入
4 3
样例输出
14 5
#include<bits/stdc++.h>
using namespace std;
vector<int> ppp;int n;
vector<int> temp;
void dfs(int index,stack<int> s,vector<int> v,int &num){
for(int i=s.size();i>=0;i--){
stack<int> stemp(s);
vector<int> vtemp(v);
for(int j=1;j<=i;j++){
int top=stemp.top();
stemp.pop();
vtemp.push_back(top);
}
stemp.push(ppp[index]);
if(index==n){
num++;
}else{
dfs(index+1,stemp,vtemp,num);
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
ppp.push_back(0);
for(int i=1;i<=n;i++){
ppp.push_back(i);
}
int num=0;
stack<int> s;
vector<int> v;
dfs(1,s,v,num);
cout<<num<<endl;
}
return 0;
}
参考了http://www.cnblogs.com/jiayith/p/4414226.html的思路;
其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了。那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个、1个、2个……栈.size()个,然后把第K个入栈,再对于 K+1个同样实施这样的方法——这就是个递归了。