博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计
阅读量:4039 次
发布时间:2019-05-24

本文共 3029 字,大约阅读时间需要 10 分钟。

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

 

转载地址:http://cntdi.baihongyu.com/

你可能感兴趣的文章
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
输入设备节点自动生成
查看>>
GNU hello代码分析
查看>>
Qt继电器控制板代码
查看>>
wpa_supplicant控制脚本
查看>>
gstreamer相关工具集合
查看>>
arm 自动升级脚本
查看>>
RS232 四入四出模块控制代码
查看>>