李白打酒*C语言简易版(递归)

题目:话说大诗人李白,一生好饮。幸好他从不开车。

一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:

无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

- 题目分析:题目中有十次花,五次店,因为最后一次之后酒为0,故最后一次应该遇到花。运用递归的思想,每次都具备两种可能性,遇花或者遇店。故递归代码如下


#include <stdio.h>
int path[100];
int ans;
void libai(int step,int flowers,int wine,int store)
{

    if(step==15)
    {
    	path[step]=1;
        flowers++;
        wine--;//最后一次肯定遇花
        if(wine==0&&flowers==10&&store==5)
        {
            for(int i=1;i<=step;i++)
                printf("%c",(path[i]==1)?'b':'a');
            printf("\n");
            ans++;
        }
        return;//返回上一级
    }
    //遇到花
    if(store<=5&&flowers<9&&wine>=1)//因为最后一次要遇到花所以要确保之前遇花不能超过9次
    {
        path[step]=1;
        libai(step+1,flowers+1,wine-1,store);
    }
    //遇到店
    if(store<5&&flowers<=9)
    {
        path[step]=0;
        libai(step+1,flowers,wine*2,store+1);
    }
}
int main()
{
    ans=0;
    libai(1,0,2,0);
    printf("%d",ans);
    return 0;
}

本人为C语言中初学者中的初学者,若有不足,请大神指点。
简单代码,不喜勿喷。