问题描述:
话说大诗人李白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
问题分析:
一、首先按照题干我们可以分两种情况讨论:
1:下一次遇到店;
2:下一次遇到花。
二、借助变量分析问题:
声明变量:
int store //店
int flower //花
int alcho //酒
int next //该变量只有 0、1两个值,0表示下次遇到店,1表示遇到花
所以遇到店该执行的操作为:
storer--;
alcho = alcho*2;
遇到花的操作为:
flower--;
alcho--;
满足条件的情况为:
store==0&&flower==0&&alcho==0&&next==1
注意:因为题目要求最后一次遇到的是花,所以next==1。
代码实现:
#include<stdio.h>
int count = 0;
void trap(int store,int flower,int alcho,int next){
if(next == 0){//下次遇到花
if(store > 0){
store--;
alcho = 2 * alcho;
}
else return;
}
else{//下次遇到店
if(flower > 0){
flower--;
alcho--;
}
else return;
}
if(store==0&&flower==0&&alcho==0&&next==1){
count++;
return;
}
trap(store,flower,alcho,1);//下次遇到花
trap(store,flower,alcho,0);//下次遇到店
}
int main(void){
trap(5,10,2,0);//下次遇到花
trap(5,10,2,1);//下次遇到店
printf("%d\n",count);
return 0;
}
int count = 0;
void trap(int store,int flower,int alcho,int next){
if(next == 0){//下次遇到花
if(store > 0){
store--;
alcho = 2 * alcho;
}
else return;
}
else{//下次遇到店
if(flower > 0){
flower--;
alcho--;
}
else return;
}
if(store==0&&flower==0&&alcho==0&&next==1){
count++;
return;
}
trap(store,flower,alcho,1);//下次遇到花
trap(store,flower,alcho,0);//下次遇到店
}
int main(void){
trap(5,10,2,0);//下次遇到花
trap(5,10,2,1);//下次遇到店
printf("%d\n",count);
return 0;
}
结果:14次。