`

题目---倒油问题

阅读更多
共有三个瓶子,容量分别为12,8,5 
现有油12斤放在容量为12斤的瓶子中,问怎么样能倒出6斤油?

/*
思路:因为不知道怎么倒油,所以只能乱碰,也就是穷举法,把所有倒油的步骤都搞出来,然后判断是否倒出想要的结果,如果得到了想要的结果,那么就不倒了,对于每一种到完后的状态,如果不符合要求,那么每一个桶又都可以是src和target

与字母全排列最大的不同是,字母全排列中因为每个下一步都需要成为一个结果,那么就把每个下一步放入递归函数,而倒油问题是下一步可能的集合中只有一个符合结果,或者不符合结果,如果符合结果则打印,不符合结果则递归
*/

/*如何实现穷举是关键,穷举什么:在每一次倒油的选择中出油桶应该试着倒到每一个目标桶中,也就是第一个桶需要试着倒到第二个桶,第三个桶。。。中
那么如何确定出油桶呢。。?
当然每个桶都有权利做出油桶

*/
class Barrel {
		int maxCapac; // 最大容量,不要设emptyCapac,如果设置两个变化的东西,程序会很难写,所以把emptyCapac变成一个方法
		int curCapac;// 当前拥有的容量

		public void pop(int num) { // 作为出油桶,倒出油
			// 如果目标桶没容量或者出油桶没油,都不能倒
			curCapac -= num;
		}

		public void push(int num) { // 作为目标桶,倒入油
			curCapac += num;
		}

		public int getEmptyCapacity() {
			return maxCapac - curCapac;
		}
	}

	class BarrelManager {
		
		private List<String> steps = new ArrayList<String>();
		
		private void go(List<Barrel[]> nextBarStatuses){
			for(Barrel[] b : nextBarStatuses){
				if(b[0].curCapac == 6 || b[1].curCapac==6 || b[2].curCapac == 6){//下面的走法中只有一种走法可能可行
					System.out.println("倒油完成 A="+b[0].curCapac+" B="+b[1].curCapac+" C="+b[2].curCapac);
				    break;
				}else{
System.out.println("倒油未完成 A="+b[0].curCapac+" B="+b[1].curCapac+" C="+b[2].curCapac);

				go(getNextSteps(b));
                                     }
			}
			
		}
		
		
		/**
		 * 得到所有下一步的正确的桶的状态,这个方法得到的是前一种状态下面的每一种倒油状态所导致的下一种走法
		 */
		public List getNextSteps(Barrel[] barrels) {
			List<Barrel[]> nextBarStatuses= new ArrayList<Barrel[]>();
			for (int sourcei = 0; sourcei < barrels.length; sourcei++) {// 每一个桶都有机会做出油桶
				for (int targeti = 0; targeti < barrels.length; targeti++) { // 每个桶有有机会做目标桶
					if (sourcei == targeti)
						continue; // 如果出油桶==目标桶,不给自己倒

					int minNum = Math.min(barrels[sourcei].curCapac,
							barrels[targeti].getEmptyCapacity());
					barrels[sourcei].pop(minNum);
					barrels[targeti].push(minNum);
					
					//判断是否倒油步骤出现过,这里用字符串,是技巧哈
					String step = "A="+barrels[0].curCapac+",B="+barrels[1].curCapac+",C="+barrels[2].curCapac;
					if(steps.contains(step)){ //如果倒油步骤出现过,避免死循环,就不进行下面的了
						rollback(barrels, sourcei, targeti, minNum);
						continue;
					}
				    steps.add(step); //记录这时的状态
					
				    Barrel[] bs = cloneBarrel(barrels);
					list.add(bs);
					
					rollback(barrels, sourcei, targeti, minNum);
				}
			}
			 return nextBarStatuses;
		}

		private void rollback(Barrel[] barrels, int sourcei, int targeti,
				int minNum) {
			barrels[sourcei].push(minNum);  //还原状态
			barrels[targeti].pop(minNum);
		}
		
		private Barrel[] cloneBarrel(Barrel[] barrels){
			Barrel b1 = new Barrel();
			b1.maxCapac =barrels[0].maxCapac;
			b1.curCapac = barrels[0].curCapac;
			
			Barrel b2 = new Barrel();
			b2.maxCapac =barrels[1].maxCapac;
			b2.curCapac = barrels[1].curCapac;
			
			Barrel b3 = new Barrel();
			b3.maxCapac =barrels[2].maxCapac;
			b3.curCapac = barrels[2].curCapac;
			return new Barrel[]{b1,b2,b3};
		}
	}
分享到:
评论

相关推荐

    新版北师大版三年级数学上册期末考试题(参考答案).pdf

    这份资料是针对新版北师大版三年级数学上册期末考试的练习题目... - 问题6是一个简单的购物问题,通过剩余的钱来倒推出每袋化肥的价格。 这些题目全面覆盖了三年级数学的基础知识,有助于学生巩固所学并提升解题能力。

    趣味编程题目

    7. 厨师倒油问题是一个经典的容量问题,可以通过一系列的倒油操作来达到目标。我们可以通过编程模拟倒油的过程,使用两个桶的容量作为变量,通过逻辑判断来确定倒油的步骤。 以上这些题目都是通过逻辑推理和编程...

    叉车工考试题目.pdf

    - 油环的主要作用是刮油,帮助润滑系统正常工作。 - 空气滤清器用于清除空气中的尘土,保护发动机免受磨损。 9. 制动系统与安全性: - 制动蹄与制动鼓间隙过大可能导致叉车跑偏,需及时调整。 - 机械式叉车通常...

    (完整版)小学三年级奥数第五讲倒推法的妙用(学生版).pdf

    - 例5:油桶问题,根据油和桶的重量变化,倒推出油的原始重量和桶的重量。 此外,还有一些涉及倒推法的应用题,例如数学考试得分的计算、树林中鸟的分布问题、寻找特定数字的过程等。这些题目都要求学生灵活运用倒...

    部编版第三十一周 还原问题.doc

    - **例4**是两桶油的转换问题,通过多次交换油的数量,推算出两桶油的初始重量。 5. **训练题分析**: - **训练一**到**训练四**提供了类似的还原问题,分别涉及数字运算、物品分配和油量转换等不同场景,要求...

    2022年泸教版五年级数学上册期中考试题及答案【可打印】.pdf

    - 题目5倒出一半油后,剩余的油和瓶重1.45千克,所以原有油2*(2.7-1.45)=2.5千克。 4. **计算题**、**作图题**和**解决问题**部分涉及了运算、图形变换和实际应用问题,需要具体的解题步骤和计算,此处不再逐一...

    食品安全知识测试卷及答案-安全教育-安全试题-综合.docx

    - **知识点扩展**:倒掉食物不能解决已经摄入体内的毒素问题,应及时采取措施并寻求医疗帮助。 10. **消化道组成部分** - **题目解析**:消化道包括口腔、咽、食管等部分,但不包括气管。 - **正确答案**:C ...

    小学数学经典20题.docx

    #### 题目13:油桶倒油问题 - **题目描述**:有两桶油,甲桶油重是乙桶油重的4倍,如果从甲桶倒入乙桶18千克,两桶油就一样重,原来两桶各有多少千克油? - **解析**:设乙桶原有油x千克,则甲桶原有油\[4x\]千克。...

    四年级数学下册第五单元分数的意义和性质5.10分数加减法课时练冀教版

    第二次倒出剩下油的,由于第一次已经倒出了,剩下的油是剩余的,则第二次倒出的也是剩余的一半。因此,两次倒出的油量相同,答案是C,两次倒出一样多。 2. 接下来的题目是分数加减法的计算练习。在这些题目中,我们...

    最新三年级上册数学试卷应用题解答问题题练习题(12).doc

    26. 数列与倒推:题目27使用倒推法,通过剩余书籍的数量逐步求解原有书籍总数。 27. 运输成本优化:题目28涉及运输费用的计算和优化,通过不同车型的组合找出最低成本方案。 28. 系统方程解题:题目29需要通过设立...

    六年级数学下册总复习题(分数、百分数应用题)精选.doc

    - 油桶问题需要理解分数的乘除运算,找出剩余油量与已倒出油量的关系。 2. **百分数应用题**: - 百分数应用题通常涉及到计算和比较百分比。如油菜籽的出油率问题,需要根据出油率和已榨油量计算剩余油菜籽。 -...

    河南省2018--年汽车类基础课对口升学考试题.docx

    压缩比是指气缸总容积与燃烧室容积之比,题目中提到的选项表明汽油机压缩比一般在7~10之间。 - 发火间隔角:直列四缸四冲程发动机的四个气缸依次进行进气、压缩、做功、排气四个冲程,形成一个工作循环,发火间隔角...

    部编人教版五年级数学上册期中考试题(汇总).pdf

    - 油瓶重量问题,倒出一半后减去的重量是油的一半,所以油的重量是(2.7-1.45)*2=2.5千克。 - 正方体拼成长方体,表面积减少2个正方形面的面积,即50平方厘米。 - 无盖水桶用料计算,需要所有侧面和底面面积之和,...

    部编版第31讲 还原问题.doc

    - **例4**:两桶油相互转移的问题,利用两次转移后油的总量来确定原始的油量。 - **例5**:两只猴子抢桃子问题,通过反复的转移和交换,计算出猴子最终各自拥有的桃子数。 4. **训练题目**: - **训练一、训练二...

    微软经典面试笔试题目

    3. 把3公升提桶里的水倒掉,再将5公升提桶里的2公升水倒入3公升提桶。 4. 再次将5公升提桶装满水。 5. 将5公升提桶里的水倒入3公升提桶,由于3公升提桶已有2公升水,所以只能再加1公升水。 6. 这时5公升提桶里剩下4...

    部编版第12讲 倒推法解题.doc

    两桶油互相倒的问题,通过最后各自24千克,我们可以逆向计算出原来每桶油的重量。 **训练3**: 1. 画片交换的情况,根据两人最后的画片数量,反推他们原本各自的画片数。 2. 人民币交换问题,通过倒推确定甲乙两人...

    基础算法递推法.pdf

    对于沙漠储油点问题,实际的算法实现会包括初始化变量 `dis[]` 和 `oil[]`,然后使用倒推策略,根据已知的卡车油耗和载油量,计算每个储油点的位置和油量。每一步都会确保卡车能够从当前储油点到达下一个,并返回...

    小升初应用题难题组(习题设计).doc

    - 包含多个分数应用题,例如仓库存粮问题、桶装油问题、竞赛人数问题、修路任务问题、面粉运输问题、书籍分配问题、学生人数问题和做题数量问题。这些问题都需要通过建立分数关系,找出关键的对应分率来解决。 ...

    六年级数学应用题难题组教案模块训练参考.pdf

    6. **瓶中水与酒精混合问题**:每次倒出一部分并加入新的液体,需要追踪酒精在整个溶液中的比例变化,使用分数运算。 7. **收割麦地问题**:工作效率的变化会影响完成任务所需的时间。需要设定工作效率的初始值和...

    防火防爆作业人员技术与安全知识考试题(附含答案).docx

    **题目1:** &gt; 液化石油气管道的日常管理是每—检查一次管道的连接件,每—检查一次管道的腐蚀情况. **选项:** - A. 年、日 - B. 月、日 - C. 日、月 - D. 日、年 **正确答案:D** **解析:** 液化石油气管道的...

Global site tag (gtag.js) - Google Analytics