1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 倒水问题解决思路

倒水问题解决思路

时间:2023-04-13 20:42:35

相关推荐

倒水问题解决思路

这个问题是在之前面试一个公司的时候遇到的,以前没遇到过这种问题,猛然上来有点懵逼。不过几分钟整理思路有了些许解题方案,但临时想的方案漏洞还是有些,思路有了,大方向对了,写代码虽然说就简单了,但大脑混沌状态真的是还不一定写出完美的代码。

题意:

给你两个容器 A B 问是否能够经过有限的步骤倒水,得到容量为 C 的水

输出最小的步数,同时输出每一步的操作。

如果不能达到目标状态,则输出impossible

思路:

总状态只有那么多, 反正每一步后都只有 6 种操作明显的 BFS 关键是每一步路径的记录。

其实就是个A星算法

每层的操作就六种可能:

一:用水池中的水装满 A

二:用水池中的水装满 B

三:把 A 中的水全部倒进废水池

四:把 B 中的水全部倒进废水池

五:把 A 中的水倒进 B 【不能溢出】

那么对应可能会有两种状态:用 k1 表示 A 中的水, k2 表示 B 中的水

如果 k1+k2 <= B 则 k2 = k1+k2; k1 = 0 【不能够装满容器 B】注意顺序

否则 k1 = k1+k2-B; k2 = B 【能够装满容器 B】

六:把 B 中的水倒进 A 【不能溢出】

也有两种情况,分析同上

如果 k1+k2 <= A 则 k1 = k1+k2; k2 = 0;

否则 k2 = k1+k2-A; k1 = A

之前也参考了网上几个代码,写的还是有点混沌,但说实话感觉还是我这个更清晰

/**** @Author: <> * @Description:* 1:->a* 2:->b* 3:a->* 4:b->* 5:a->b* 6:b->a* @Date: Created in : * @Modified by:*/public class CurrStatus {public int ka=0,kb=0;public int op=0;public CurrStatus pre;}

package com.fjsh.mnp;import com.fjsh.mnp.models.CurrStatus;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;/*** @Author: <>* @Description:* @Date: Created in :* @Modified by:*/public class SelfMain {public static void main(String[] args) {final CurrStatus head = new CurrStatus();List<CurrStatus> currStatusList=new LinkedList<CurrStatus>(){{add(head);}};int a = 3, b = 5, c = 4;CurrStatus tail = dealPool(currStatusList, a, b, c);if (tail == null) {System.out.println("impossible");} else {List<Integer> ops=new ArrayList<Integer>();while (tail.op != 0) {ops.add(tail.op);tail = tail.pre;}for(int i=ops.size()-1;i>=0;i--){if(ops.get(i)==1){System.out.println("倒满a");}if(ops.get(i)==2){System.out.println("倒满b");}if(ops.get(i)==3){System.out.println("倒出a");}if(ops.get(i)==4){System.out.println("倒出b");}if(ops.get(i)==5){System.out.println("a倒入b");}if(ops.get(i)==6){System.out.println("b倒入a");}}}}public static CurrStatus dealPool(List<CurrStatus> currStatusList, int a, int b, int pool) {if(a+b<pool){return null;}int max=0;while (max<a*b){List<CurrStatus> currStatuses = new LinkedList<CurrStatus>();for (CurrStatus currStatus : currStatusList) {//循环处理六种条件for (int i = 1; i <= 6; i++) {CurrStatus item = new CurrStatus();item.op = i;item.pre = currStatus;if (i == 1) {item.ka = a;item.kb = currStatus.kb;} else if (i == 2) {item.kb = b;item.ka = currStatus.ka;} else if (i == 3) {item.ka = 0;item.kb = currStatus.kb;} else if (i == 4) {item.kb = 0;item.ka = currStatus.ka;} else if (i == 5) {if (currStatus.ka + currStatus.kb <= b) {item.ka = 0;item.kb = currStatus.ka + currStatus.kb;} else if (currStatus.ka + currStatus.kb > b) {item.kb = b;item.ka = (currStatus.ka + currStatus.kb) - b;}} else if (i == 6) {if (currStatus.ka + currStatus.kb <= a) {item.kb = 0;item.ka = currStatus.ka + currStatus.kb;} else if (currStatus.ka + currStatus.kb > a) {item.ka = a;item.kb = (currStatus.ka + currStatus.kb) - a;}}if (item.ka == pool || item.kb == pool || item.ka+ item.kb == pool) {return item;}currStatuses.add(item);}}max++;currStatusList=currStatuses;}return null;}}

附带上当时参考的url:/A/n2d99RL6dD/

搞点积分不容易,有兴趣的下载下:/download/a925907195/11173095

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。