JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计

看到了这样的一道题目,还挺有意思,可以通过不同的算法设计来求解。

话说大诗人李白,一生好饮。一日,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
 无事街上走,提壶去打酒。
 逢店加一倍,遇花喝一斗。
 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 
 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。

像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。


问题分析

通过题目描述,我们可以获得信息:

  • 初始条件:酒壶中有酒2斗
  • 逢店加一倍,遇花喝一斗
  • 遇到店5次,遇到花10次
  • 最后一次遇到的是花,喝光了酒壶中的酒(隐含信息是酒壶中剩余的1斗酒被喝光了,结束)。

于是题目可以简化为,李白从家里出来,有2斗酒,遇店5次,遇花9次,最后还剩1斗酒。


算法设计

1. 采用递归算法

 /** 递归算法*/public static int func(int bistro, int flower, int amount) {/** 处理小酒馆数量、花的数量、酒的余量异常情况* */if (bistro < 0 || flower < 0 || amount < 0) {return 0;}if (bistro == 0 && flower == 1 && amount == 1) {return 1; // 保证最后一个遇见花并且把酒喝光}// 逢店加一倍,遇花喝1斗return func(bistro - 1, flower, 2 * amount) + func(bistro, flower - 1, amount - 1);}

完整的程序执行结果(递归算法):

package com.bean.algorithmbasic;public class LiBaiHeJiu3 {private static int ANSWER = 0;public static void main(String[] args) {int answer=func(5,10,2);System.out.println("answer = " + answer);}/** 递归算法*/public static int func(int bistro, int flower, int amount) {/** 处理小酒馆数量、花的数量、酒的余量异常情况* */if (bistro < 0 || flower < 0 || amount < 0) {return 0;}if (bistro == 0 && flower == 1 && amount == 1) {return 1; // 保证最后一个遇见花并且把酒喝光}// 逢店加一倍,遇花喝1斗return func(bistro - 1, flower, 2 * amount) + func(bistro, flower - 1, amount - 1);}}

answer = 14

2. 采用DFS算法

/** DFS算法设计:* 参数选择:amount代表酒量;bistro代表小酒馆;flower代表花;flag为标记 flag=0表示结束条件* */public static void dfs(int amount,int bistro,int flower,int flag)  {  if(bistro==0&&flower==0)   {  if(flag==0&&amount==0)//标记最后一次遇到的是花   {  ANSWER++;  }  //return;//已经没有店家和花,此时不管是否情况正确,都退出递归   }  if(bistro > 0)  {    //amount*2,满足条件逢店加倍;bistro-1:小酒馆数-1;dfs(amount*2,bistro-1,flower,1); //标记遇到的是店家   }    if(amount > 0 && flower > 0)  {    //amount-1,满足条件逢花喝1斗;flower-1:遇到花的次数-1;dfs(amount-1,bistro,flower-1,0); // 标记遇到的是花   }    }  

完整的程序执行结果:

package com.bean.algorithmbasic;public class LiBaiHeJiu2 {private static int ANSWER=0;public static void main(String[] args) {/** 调用DFS算法,设定条件* 初始时酒2都,遇到5次店,10次花,最后就没有了,设定标记为flag=0*/dfs(2,5,10,0);System.out.println("ANSWER = "+ANSWER);}/** DFS算法设计:* 参数选择:amount代表酒量;bistro代表小酒馆;flower代表花;flag为标记 flag=0表示结束条件* */public static void dfs(int amount,int bistro,int flower,int flag)  {  if(bistro==0&&flower==0)   {  if(flag==0&&amount==0)//标记最后一次遇到的是花   {  ANSWER++;  }  //return;//已经没有店家和花,此时不管是否情况正确,都退出递归   }  if(bistro > 0)  {    //amount*2,满足条件逢店加倍;bistro-1:小酒馆数-1;dfs(amount*2,bistro-1,flower,1); //标记遇到的是店家   }    if(amount > 0 && flower > 0)  {    //amount-1,满足条件逢花喝1斗;flower-1:遇到花的次数-1;dfs(amount-1,bistro,flower-1,0); // 标记遇到的是花   }    }
}

ANSWER = 14

JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计相关推荐

  1. 基于java+swing的潜艇大战项目游戏(java+swing)

    基于java+swing的潜艇大战项目游戏(java+swing) 功能简介: Java swing实现的一款小游戏潜艇大战的项目源码 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 bool ...

  2. java随机数抽奖系统_Java实现游戏抽奖的算法

    Java实现游戏抽奖的算法 发布时间:2020-05-29 13:27:44 来源:亿速云 阅读:282 作者:鸽子 Java开发游戏抽奖算法主要有随机数一一对应.离散法Alias算法等. 一.随机数 ...

  3. java/php/net/python“最终幻想14”游戏时装图鉴网站设计与制作

    本系统带文档lw1万字+答辩PPT+查重 如果这个题目不合适,可以去我上传的资源里面找题目,找不到的话,评论留下题目,或者站内私信我, 有时间看到机会给你发 1.关于"最终幻想14" ...

  4. 【C#算法实现】QQ小游戏天天连萌(连连看)算法。

    2019独角兽企业重金招聘Python工程师标准>>> 算法是程序的灵魂,优秀的算法可以高效率解决实际问题.继腾讯安卓游戏天天爱消除之后又一款十分好玩的游戏--天天连萌,其实就是以前 ...

  5. Java窗体实现飞机躲子弹游戏,java awt swing 飞机躲子弹

    [实例简介] [实例截图] [核心代码] package com.plane.game; import javax.swing.JComboBox; import javax.swing.JFrame ...

  6. [蓝桥杯][算法提高VIP]开灯游戏(dfs)

    题目描述 有9盏灯与9个开关,编号都是1~9. 每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的). 具体如下: 第一个开关控制第二,第四盏灯: 第二个开关控制第一, ...

  7. java——博弈算法实现井字棋游戏

    通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...

  8. java ktv喝酒游戏

    import java.util.Scanner; import java.util.Random; public class cs喝酒游戏 { static Scanner scanner; sta ...

  9. Java游戏里面的星球大战_星球大战手机游戏-JAVA程序算法

    内容简介: 毕业设计 星球大战手机游戏-JAVA程序算法,共18页,9196字 摘 要 近年来,随着各种不同设备,尤其是移动通信设备的飞速发展诞生了一项新的开发技术-J2ME.它定位在消费性电子产品的 ...

最新文章

  1. 2021年大数据基础(四):​​​​​​​​​​​​​​​​​​​​​大数据业务分析基本步骤
  2. 初级开发人员的缺点_这是我想放弃初级开发人员时所做的事情
  3. 利用python进行数据分析 百度云-利用Python进行数据分析 原书第2版.pdf
  4. 如何结合SharePoint Designer 2010 与Visio 2010 创建工作流?
  5. Spring Cloud Sleuth进阶实战
  6. struct和union,enum分析
  7. 深入分析.NET应用程序SQL注入【危害】
  8. 微信小程序云开发教程-WXML入门-数据绑定
  9. Atitit 获取剪贴板内容 目录 1.1. ava提供两种类型的剪贴板:系统的和本地的. 1 1.2. Atitit 剪贴板数据类型 DataFlavor 1 1.3. Atitit 获取剪贴板内
  10. 使用Requests+xpath实现简单的数据爬取
  11. ubuntu 最新提权漏洞_Ubuntu和Debian最新的KDE安全漏洞,附-修复指南
  12. 2020年三非上岸北邮计算机院考研经验贴(励志)
  13. 查询天气预报的php代码,jQuery输入城市查询天气预报代码
  14. 459-Linux基础(echo)
  15. Excel如何查找重复内容
  16. Android中常用的一些颜色色值color整理
  17. 从 MVC 到使用 ASP.NET Core 6.0 的最小 API
  18. STM32系统定时器SysTick
  19. 机器学习常用「微积分」知识速查手册
  20. 有三个线程T1,T2,T3,下面方法可以确保它们按顺序执行的有()该线程继续执行

热门文章

  1. 微信号码开通状态检测
  2. 微pe工具箱+软碟通 制作 U盘启动盘
  3. html怎么导入flash视频,DW如何在网页中插入Flash视频?
  4. 学会这三款软件,可以轻松完成录音转文字操作
  5. CMDN创新应用:果库 - 帮助你发现喜欢的商品
  6. matlab股票分析系统,matlab股票预测系统,matlab股票决策
  7. 微信小程序访问豆瓣电影API 403 400
  8. 导入依赖失败,报错信息Failed to resolve: com.*.*:*:0.0.0<a href=““>Show in Project Structure dialog
  9. 番茄助手 Visual Assist X 下载安装及使用
  10. flutter中地图定位