李白打酒(蓝桥杯2014)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了李白打酒(蓝桥杯2014)相关的知识,希望对你有一定的参考价值。

                                              李白打酒(蓝桥杯2014)

 

1.题目描述:

 

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

 

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

 

无事街上走,提壶去打酒。 
逢店加一倍,遇花喝一斗。 
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。

 

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

2.

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
//不需要打印每个具体方案,只给出一共多少方案。
int fun(int store,int flower,int wine)
{
if(store>5 || flower>10)
return 0;
else if(store==5 && flower==9 && wine==1)
{
return 1;
}
int re=0;
re+=fun(store+1,flower,wine*2);
re+=fun(store,flower+1,wine-1);
return re;
}

//打印每个具体方案,并给出一共多少方案
int fun(int store,int flower,int wine, char *str)
{
if(store>5 || flower>10)
return 0;
else if(store==5 && flower==9 && wine==1)
{
printf("%sb\\n",str);
return 1;
}
int re=0,len=strlen(str);
char *p=(char *)malloc((len+2)*sizeof(char));
strcpy(p,str);
strcat(p,"a");
re+=fun(store+1,flower,wine*2,p);
strcpy(p,str);
strcat(p,"b");
re+=fun(store,flower+1,wine-1,p);
if(p) free(p);
return re;
}
int main()
{
printf("一共%d个方案\\n\\n",fun(0,0,2));
printf("一共%d个方案\\n",fun(0,0,2,""));
return 0;
}

技术分享

 

3.总结:用递归的思想做,题中将酒量的变化分为两类:第一,是遇见店乘2;第二,是遇见花减1.

          两种情况的递归计算!

 

















































以上是关于李白打酒(蓝桥杯2014)的主要内容,如果未能解决你的问题,请参考以下文章

大战蓝桥杯每日算法详解解析(C/C++)

蓝桥杯31天真题冲刺|题解报告|第二十一天

第十三届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)

第十三届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组思考+总结

第十四届蓝桥杯三月真题刷题训练——第 21 天

第十三届蓝桥杯省赛C++B组 真题题解(详细讲解+代码分析)看这篇就够了~~~