每日编程一小时(第十三天)

一.问题描述

话说大诗人李白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
    无事街上走,提壶去打酒。
   
逢店加一倍,遇花喝一斗。
    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb就是合理的次序。

像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)

二.设计思路

1.设置打酒次数shop=0,看花次数flower=0,酒wine=9,全局变量a=0

2.设计递归函数可知最后一次必是遇到花,所以当shop>5,或者flower>9时都是不符合条件的,

  当shop==5&flower==9时,当wine==1时,符合条件,这时使i++

3.递归调用函数参数分别为:shop+1,flower,wine*2和shop,flower+1,wine-1直到结束

4.最后a的值就是总次数

三.流程图

 

四.代码实现

#include <iostream>
using namespace std;
int a = 0;
void f(int shop, int flower, int wine)
{
    if (shop > 5 || flower > 9)
        return;
    if (shop == 5 && flower == 9)
    {
        if (wine == 1)
        {
            a++;
            return;
        }
    }
    f(shop, flower + 1, wine - 1);
    f(shop + 1, flower, wine * 2);
}
int main()
{
    f(0, 0, 2);
    cout << a;
    return 0;
}

 

posted @ 2023-04-22 15:53  伐木工熊大  阅读(27)  评论(0)    收藏  举报