李白打酒*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语言中初学者中的初学者,若有不足,请大神指点。
简单代码,不喜勿喷。