【原创】由分水所想到的

来源:互联网 发布:php office转pdf 编辑:程序博客网 时间:2024/06/10 16:07

     今天和周三石在讨论一个问题的计算机解法的时候,突然对倒水的这个问题有了比较稳妥的一个算法,也不枉费我一番苦心。
问题场景:
现有一10L的桶子X(装满水),然后有Y桶和Z桶,分别是7L和3L的容积(均为空),现在要分出5L,怎么办?
    我们一般遇到这样的场景的时候会首先不会去分析它的解法,而是在大脑里面不断的循环寻找解决方法,但是注意,这样做的效率是很低的,可能尝试出来了,但是也可能出现遇到另外一个照样不会的问题,所以我们需要了解它,下面我来讲讲我参悟出的一点拙陋的想法.

我们不妨用另外一中思维方式,倒过来看问题,或者找个参照物,如果按照常规思维我们第一关注的是X,然后才是Y和Z的关系,我们挖空心思的去寻求X,Y,Z和5之间的关系,根本没有对5倒叙来进行相应的分析。
我的思维解法;
1.首先5L 的容积最后是装到哪个里面的 在这里无非就是Y || X
2.假设在最后由X里面装5L,那么我把Z中的水倒入Y,则Y中必5L
3.假设在最后由Y里面装5L,那么我把Z中的水倒入X,则Y中必5L
4.由1/2/3得出结论,我们得知最后Y中必有5L
5.则可知 我们需要寻求的偏移量无非是 2 / -2 , 那么我们在某一个桶中需倒出2L或者需要倒入2L,则我们可知道通过绝对容积值来判断 Z为最佳选择 7与3都为奇数,那么他们出现偏移量1的概率在Z中或者在Y中一样大,但是2条件中需要保持最后Y又5L的容积,则得知Y中的偏移量为 -2 ,则判断Z为2
6.既然知道了Z的偏移量,我们再来看就简单多了,既然Y和Z都为奇数,那么组装倍数的差距 Y/Z==2,并且Y % Z==1 则判断Y向Z中导入2次,并或者Z向Y中导入3次,则余下的1放入Z中,得到偏移量 2 或者 -2,则将 Y满 导入Z则 Y+(-1)(2) = 5为所求

我们再次纵观整个推理过程,主要的设计在偏移量的控制和最后的流程设计上面,不难得出结论,在任何符合上述思维的算法中,用倒序法 + 离散数学 + 偏移量 则可以清楚地在未说明怎么倒之前其实整个过程已经在大脑里面回顾了一遍,这种方式也 同时倒序也说明了在 编程语言中的递归为什么先要找结束条件的问题,这里的求偏移量的过程就相当于将 递归中的递归关系挂钩,不难得出对于任意值的倒水问题的最终解法 ,偏移量与最小值的差值不满足Mod的差距的时候,就断定倒不出指定的容积,这就是分析的整个过程。

原创粉丝点击