1095 火车出站 DFS

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个同样实施这样的方法——这就是个递归了。

猜你喜欢

转载自blog.csdn.net/csg3140100993/article/details/82314906
dfs