标题:李白打酒

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

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

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

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

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

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

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

答案:14

先提供两种用枚举方式来解决此问题的方法,前面14个格子要摆放的是0,1(用0标识花,1标识店)

方案一,用0,1把前14个格子按照字典序打印出来,但要保证其0,1的总数小于规定总数。然后模拟这个过程。

代码:

 /*方法1*/#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 20
using namespace std;
int num[MAXN],s=;//花记为 0,店记为 1
void dfs(int cur)
{
int n0=,n1=,i,j,c=;
bool flag=true;
if(cur==)
{
for(i=;i<=;i++)
{
c=num[i]==?c-:c*;
if(c==)
{
flag=false;
break;
}
}
if(flag==false)
return ;
else
{
if(c==)
{
s++;
for(i=;i<=;i++)
cout<<num[i]<<' ';
cout<<<<endl;
}
return ;
}
}
for(i=;i<=;i++)
{
if(i==)
{
for(j=;j<=cur-;j++)
{
if(num[j]==)
n0++;
}
if(n0<)
{
num[cur]=;
dfs(cur+);
num[cur]=-;
}
}
else
{
for(j=;j<=cur-;j++)
{
if(num[j]==)
n1++;
}
if(n1<)
{
num[cur]=;
dfs(cur+);
num[cur]=-;
} }
}
}
int main()
{
memset(num,-,sizeof(num));
dfs();
cout<<s<<endl;
return ;
}

方案二,我们其实只要将5个1填入前14个格子里,其实是 种方案,我们依旧可以用枚举的方式实现,依次去按字典序排列5个数(但必须是按递增的序列排列)选取的数字是从1-14里选择

代码:

 /*方法2*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 20
using namespace std;
int num[MAXN],ans[MAXN],s=;//花记为 0,店记为 1
void dfs(int cur,int k)
{
int ok,c=,i,j;
bool flag=true;
if(cur==)
{
memset(num,,sizeof(num));
for(i=;i<=;i++)
{
num[ans[i]]=;
}
for(i=;i<=;i++)
{
c=num[i]==?c-:c*;
if(c==)
{
flag=false;
break;
}
}
if(flag==false)
return ;
else
{
if(c==)
{
s++;
for(i=;i<=;i++)
cout<<num[i]<<' ';
cout<<<<endl;
}
return ;
}
}
for(i=k+;i<=;i++)
{
ok=;
for(j=;j<=cur-;j++)
{
if(ans[j]==i)
ok=;
}
if(ok)
{
ans[cur]=i;
dfs(cur+,i);
}
}
}
int main()
{
memset(ans,,sizeof(ans));
dfs(,);
cout<<s<<endl;
return ;
}

而递归的方式实现将变得更加简洁。

由于实现此过程的总数等于开头为a和开头为b的总和,再递归这两个决策,直到a==0&&b==0&&c==1结束。

代码:

 /*递归*/
#include<iostream>
using namespace std;
int sum=;
int f(int a,int b,int c){ // a:店的总数 b:花的总数减1 c:酒的初值
// 任何初始状况,都有两个可能:先遇到店,或者先遇到花
if(a>)
f(a-,b,c*); // 逢店加一倍
if(b>)
f(a,b-,c-); // 遇花喝一斗
if(a==&&b==&&c==) //这个是满足要求的终止条件。没有店剩下,还剩一朵花和一斗酒
sum=sum+;
return sum;
}
int main()
{
f(,,);
cout<<sum<<endl;
return ;
}

蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归的更多相关文章

  1. 蓝桥杯 2014本科C++ B组 奇怪的分式 暴力枚举

    蓝桥杯 枚举 奇怪的分式 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1 ...

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

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

  3. 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索

    历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角 ...

  4. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  5. 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版

    2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...

  6. 2014年第五届蓝桥杯试题C/C++程序设计B组——李白打酒

    题目描述: 标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共 ...

  7. [蓝桥杯]2014蓝桥省赛B组题目及详解

    /*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小 ...

  8. 蓝桥杯第五届B组 李白打酒

    外面的小雨下着,风吹着,在实验室敲着代码 时隔一年之后再次做这道题,依然神一样的回溯出来: 标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他 ...

  9. 2017第八届蓝桥杯C/C++语言A组

    一:题目: 标题:迷宫 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R ...

随机推荐

  1. 无向图的点双连通分量(tarjan模板)

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...

  2. Hibernate中的session和load延迟载入矛盾问题,怎样解决?

    假设延迟载入出现session close的情况下 方法1.在web.xml中配置spring的openSessionInViewFilter <filter>  <filter-n ...

  3. scheme语言编写执行

    scheme是lisp的一种 编辑器能够用emacs.网上有非常多教导怎样编写的 (begin (display "hello") (newline)) 编写完以.scm保存,这里 ...

  4. Android SDK下载速度慢的解决方法(简单使用代理)

    相信做android开发的同学们.一定会遇到的问题就是google那边常常崩,可是学习的開始.我们又必须要用Android SDK,(几个G的大小),一般我们装完ADT之后(假设你用的是Eclipse ...

  5. MOS简介

    功率半导体器件机能 MOS管(击穿原因),它采用“超级结”(Super-Junction)结构,故又称超结功率MOSFET.全数字控制是发展趋势,已经在很多功率变换设备中得到应用.既管理了对电网的谐波 ...

  6. Django-mysq数据库链接问题

    Django链接MySQL数据库有可能会报no model named MySQLdb, 解决办法: 首先安装pymysql 然后进入到项目目录,找到__init__.py文件,在里面添加 impor ...

  7. ios开发动物园管理 继承多态的实现

    // // main.m // 继承 // // #import <Foundation/Foundation.h> #import "Animal.h" #impor ...

  8. 怎样退出App之前唤醒还有一个App?

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 SDK并没 ...

  9. HTML5即将迎来黄金时代 轻应用再成行业焦点

    2015-01-23 11:03:09     来源:快鲤鱼 大众能看到的H5效果拜“微信”所赐,几乎每天都有H5页面的推广以及H5小游戏在微信上传播.其实,H5的大热与百度不无关系,2012年开始, ...

  10. 初探IO复用

    前言 在之前的文章中,我具体实现了一个并发回射服务器并给它加载了僵尸子进程的自动清理信号机制.在正常情况下,它已经可以很好地工作了,但它能否合理应对一些特殊情况呢? 问题发现 先来看看当服务器的客户子 ...