问题描述
题目来源
:2014年第五届蓝桥杯C/C++程序设计本科B组决赛
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站
。
X星球太死板,要求每辆路过的车必须进入检查站
,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。
现在足足有16辆车啊,亲!需要你计算出可能次序的数目。
解题思路
将车队长度分为3段:
(1)左侧
未经过检查的车队;
(2)中间
在死胡同检查站的车队;
(3)右侧
经过检查的车队。
对于整个车队,倘若一次只允许一辆车的位置发生变化
,那么整个车队的变化只有两种情况
:
(1)在死胡同检查站的最外面的车进入右侧车队;
(2)左侧未经过检查的最前面的车进入死胡同检查站。
那么,用DFS遍历所有的状态即可得出结果。
AC代码
#include <iostream>
using namespace std;
int count = 0;
void dfs(int left_unchecked, int mid_checking, int right_checked)
{
if (right_checked == 16)
{
++count;
}
if (mid_checking >= 1)
dfs(left_unchecked, mid_checking - 1, right_checked + 1);
if (left_unchecked >= 1)
dfs(left_unchecked - 1, mid_checking + 1, right_checked);
}
int main()
{
dfs(16, 0, 0);
cout << count << endl;
return 0;
}