C语言递归李白打酒

xiaoxiao2021-02-28  147

题目描述:

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

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

无事街上走,提壶去打酒。  逢店加一倍,遇花喝一斗。  这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。

#include <stdio.h> int count = 0; void libai(int store, int flower,int alco, int pre, char *ch, int index) { if(store == 0 && flower == 0) { if(alco == 0 && pre == 0) { int i; for(i = 0;i < 15; i++) { printf("%c",ch[i]); } printf("\n"); count++; } return; } if(store > 0) { ch[index] = 'a'; libai(store - 1, flower, alco * 2, 1, ch, index + 1); } if(flower > 0) { ch[index] = 'b'; libai(store, flower - 1, alco - 1, 0, ch, index + 1); } } void libai2(int alco, int store, int flower, char *ch, int index) { if(store > 5 || flower > 10) { return; } if(store == 5 && flower ==9) { if(alco == 1) { int i; for(i = 0;i < 15; i++) { printf("%c",ch[i]); } printf("\n"); count++; } return; } ch[index] = 'a'; libai2(alco * 2, store + 1, flower, ch, index + 1); ch[index] = 'b'; libai2(alco - 1, store, flower + 1, ch, index + 1); } int main() { char ch[20]; libai2(2, 0, 0, ch, 0); printf("%d\n",count); return 0; }

本题就是一个不断递归的函数,假定先遇到店,然后递归计算直到满足打酒喝酒的条件就将计算符+1;再假定先遇到花,然后递归计算剩下的可能。遇到满足要求的组合就加1。

转载请注明原文地址: https://www.6miu.com/read-61879.html

最新回复(0)