MENU

第五届蓝桥杯决赛B组C/C++——出栈次序

April 21, 2018 • Read: 3048 • 算法阅读设置

出栈次序

X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共 16 辆车,按照编号先后发车,夹在其它车流中,缓缓前行。路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示

X 星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?为了方便起见,假设检查站可容纳任意数量的汽车。显然,如果车队只有 1 辆车,可能次序 1 种;2 辆车可能次序 2 种;3 辆车可能次序 5 种。

现在足足有 16 辆车啊,亲!需要你计算出可能次序的数目

题解

最简单的办法就是递归,递归分三种情况考虑就行了

  1. 当车道左边没车,不管这时检查站里面有没有车,都只有一种次序 return 1
  2. 当左边有车,检查站里面没车,按照题目要求,每辆车都必须要进检查站,所以左边车的数量 - 1,检查站内车的数量 + 1 return f(n-1,1)
  3. 如果检查站里面有车,这种情况下的方案数是两个递归的和,这两个递归分别对应的情况是:左边再来一辆车进站和从检查站出去一辆车 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;
}
Last Modified: May 12, 2021
Archives Tip
QR Code for this page
Tipping QR Code