/*如果某问题的解可以由多个步骤得到,而每个步骤都有若干种选择(这些候选方案可能依赖于先前作出的选择),且可以用递归来实现,则它的工作方式可以用解答树来描述*/
#include<iostream>
using namespace std;int cnt = 0 ;//用来记录所有可能的情况数
char path[20];
void dfs(int m,int n,int r,int c)//m表示遇见花的次数,n表示遇见店的次数,r表示酒的数量,c记录路径path当前下标
{
if(m < 0 || n < 0 || r < 0)//当遇见花的次数小于零或者遇见店的次数小于零或者酒已彻底喝完则结束递归
return ;
if(m==0 && n==0 && r==1)//传过来n=9,即终止条件时是遇见最后一家店之前,此时酒的数量应为1而不是0
{
path[c] = '\0';
cout << path << endl;
++cnt;//形成一条路径,cnt++
//在这里写return是不对的,因为第二次dfs的时候,n是小于0的,那么就无法返回
}
path[c] = 'a' ;//联想解答树,每一层只有a 和b两种选择
dfs(m-1,n,r*2,c+1);//递归完成之后又回到源点,也就是说一开始path[c]=a,深搜一遍后path[c]=b
path[c] = 'b' ;//可以理解为此时的c和令path[c]=‘a’的c是相同的
dfs(m,n-1,r-1,c+1);
}
int main()
{
dfs(5,9,2,0);//直接默认最后遇见的是店
cout << cnt << endl;
return 0;
}