出栈次序
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共 16 辆车,按照编号先后发车,夹在其它车流中,缓缓前行。路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示
X 星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?为了方便起见,假设检查站可容纳任意数量的汽车。显然,如果车队只有 1 辆车,可能次序 1 种;2 辆车可能次序 2 种;3 辆车可能次序 5 种。
现在足足有 16 辆车啊,亲!需要你计算出可能次序的数目
题解
最简单的办法就是递归,递归分三种情况考虑就行了
- 当车道左边没车,不管这时检查站里面有没有车,都只有一种次序 return 1
- 当左边有车,检查站里面没车,按照题目要求,每辆车都必须要进检查站,所以左边车的数量 - 1,检查站内车的数量 + 1 return f(n-1,1)
- 如果检查站里面有车,这种情况下的方案数是两个递归的和,这两个递归分别对应的情况是:左边再来一辆车进站和从检查站出去一辆车 return f(n - 1,m + 1) + f(n,m - 1)
代码
#include <bits/stdc++.h>
using namespace std;
int f(int n,int m)//左边车的数量,检查站的中的数量
{
int a;
if(n == 0)//如果左边没车
return 1;
if(m == 0)//如果检查站没车,就要入站
return f(n - 1,1);
if(m > 0)//如果检查站有车
//分两种情况:1.左边再来一辆车进站 2.检查站出去一辆车
return f(n - 1,m + 1) + f(n,m - 1);
}
int main()
{
cout<<f(16,0);
return 0;
}