题目描述:

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



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

无事街上走,提壶去打酒。

    逢店加一倍,遇花喝一斗。



    这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 



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



    注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。

解题思路:

这是一个典型的通过递归求解的问题,实际上,李白童鞋做了15次操作(要么壶中酒加倍,要么壶中酒减去一斗),最后跳出递归的条件是有5个a和10个b,并且最后一个是b。

程序代码:

#include<iostream>
using namespace std;
int count = 0;
char a[15];
void fun(int i,int store,int flower,int wine)
{
if(store>5||flower>10)return;
else if(store==5&&flower==10&&i==15)
{
if(a[14]=='b'&&wine==0)
{
count++;
}
return;
}
a[i] = 'a';
fun(i+1,store+1,flower,wine*2); //逢店加一倍
a[i] = 'b';
fun(i+1,store,flower+1,wine-1); //遇花喝一斗
}
int main()
{
fun(0,0,0,2);
cout<<count<<endl;
return 0;
}

输出结果为14.

我们还可以通过添加一个输出函数将所有可能的情况都打印出来。

#include<iostream>
using namespace std;
int count = 0;
char a[15];
void show(char *a,int num)
{
int i=0;
while(i<num)cout<<a[i++];
cout<<endl;
}
void fun(int i,int store,int flower,int wine)
{
if(store>5||flower>10)return;
else if(store==5&&flower==10&&i==15)
{
if(a[14]=='b'&&wine==0)
{
count++;
show(a,15);
}
return;
}
a[i] = 'a';
fun(i+1,store+1,flower,wine*2); //逢店加一倍
a[i] = 'b';
fun(i+1,store,flower+1,wine-1); //遇花喝一斗
}
int main()
{
fun(0,0,0,2);
cout<<count<<endl;
return 0;
}

输出结果为:

ababbbbbabababb

abbabbabbbababb

abbabbbaabbbabb

abbabbbabaabbbb

abbbaabbabbbabb

abbbaabbbaabbbb

abbbabaabbabbbb

baababbbbbababb

baabbabbabbbabb

baabbabbbaabbbb

baabbbaabbabbbb

babaababbbbbabb

babaabbabbabbbb

bababaababbbbbb

14

2014蓝桥杯B组初赛试题《李白打酒》的更多相关文章

  1. 2014蓝桥杯B组初赛试题《啤酒和饮料》

    题目描述: 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元.     我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒.     注意:答案是一个整数.请通过 ...

  2. 2014蓝桥杯B组初赛试题《六角填数》

    题目描述: 如图[1.png]所示六角形中,填入1~12的数字.     使得每条直线上的数字之和都相同.     图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交 ...

  3. 2014蓝桥杯B组初赛试题《奇怪的分式》

    题目描述: 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是:     1/4 乘以 8/5      小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)   ...

  4. 2014蓝桥杯B组初赛试题《切面条》

    题目描述: 一根高筋拉面,中间切一刀,可以得到2根面条.     如果先对折1次,中间切一刀,可以得到3根面条.     如果连续对折2次,中间切一刀,可以得到5根面条.     那么,连续对折10次 ...

  5. 第七届蓝桥杯javaB组真题解析-方格填数(第六题)

    题目 /* 方格填数 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显 ...

  6. 第七届蓝桥杯JavaB组——第6题方格填数

    解决方案:利用全排列和递归 使用Java中的集合API:HashMap ArrayList package com.lzp.lanqiaoseven.p6; import java.util.*; / ...

  7. 六角填数|2014年蓝桥杯B组题解析第七题-fishers

    六角填数 如图所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 思路 ...

  8. 蓝桥杯 2014本科C++ B组 六角填数 枚举排列

    标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填 ...

  9. java实现第五届蓝桥杯六角填数

    六角填数 题目描述 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不 ...

随机推荐

  1. 旧书重温:0day2【5】shellcode变形记

    紧接上一篇,结合第一篇 //这篇文章主要成功溢出一个带有缓冲区溢出的小程序,其中我们的shellcode被strcpy截断了所以我们需要变形shellcode,这个实验中也出现了很多意想不到的拦路虎, ...

  2. 【MFC】CDC::BitBlt介绍

    CDC::BitBlt介绍 2011-11-04 08:25 19576人阅读 评论(6) 收藏 举报 摘自: http://blog.csdn.net/bberdong/article/detail ...

  3. SHELL 脚本----常用的命令

    一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂   建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行she ...

  4. 【英语】Bingo口语笔记(86) - stand系列

  5. 分类(类别/Category)与 类扩展(Extension)

    一.分类(类别/Category) 1.适用范围      当你已经封装好了一个类(也可能是系统类.第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类, ...

  6. fft蝶形算法的特点

  7. Flyway客户端使用

    一.flyway介绍 Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式.Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要 ...

  8. 如何注册java程序为windows服务

    如何注册java 程序为windows 服务 最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件.由于我想编写的关机程序是运行在别人机器上,只能让该机器在 ...

  9. AppCan上下拉列表刷新

    function initBounce(funcTop, funcBottom){ uexWindow.setBounce("1"); if (!funcTop && ...

  10. Object-C 多线程中锁的使用-NSLock

    在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法.   一.使用synchronized方式   //线程1 dispatch_async(dispatch_ge ...