李白打酒

/*如果某问题的解可以由多个步骤得到,而每个步骤都有若干种选择(这些候选方案可能依赖于先前作出的选择),且可以用递归来实现,则它的工作方式可以用解答树来描述*/

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值