数据结构与算法之穷举法

来源:互联网 发布:淘宝人气增长 编辑:程序博客网 时间:2024/06/05 23:42

1 泊松分酒算法

1.1 核心思想

按A->B->C顺序分倒操作
(1)当B杯空(bb2=0)时,从A杯往B杯里倒酒。
(2)当B杯不为空、C杯未满(bb2!=0 && bb3!=C)时,从B杯分一次或多次倒满C杯。
(3)当C杯满了(bb3==C)时,从C杯倒回A瓶

1.2 演示图

(1)步骤解析

//      A杯:12   B杯:0   C杯:0 //      A杯:4   B杯:8   C杯:0 (1)//      A杯:4   B杯:3   C杯:5 (2)//      A杯:9   B杯:3   C杯:0 (3)//      A杯:9   B杯:0   C杯:3 (2)//      A杯:1   B杯:8   C杯:3 (1)//      A杯:1   B杯:6   C杯:5 (2)//      find the bottle

1.3 源码

package com.dn.sharewine;/** * 泊松分酒算法  *  * 按A->B->C顺序分倒操作    (1)当B杯空(bb2=0)时,从A杯往B杯里倒酒。   (2)当B杯不为空、C杯未满(bb2!=0 && bb3!=C)时,从B杯分一次或多次倒满C杯。   (3)当C杯满了(bb3==C)时,从C杯倒回A瓶。 * */public class ShareWine {    private int A = 12;// A酒杯容量    private int B = 8;// B酒杯容量    private int C = 5;// C酒杯容量    private int m = 6;// 目标酒量    // 假设一开始12,0,0    private void backBottle(int bb1, int bb2, int bb3) {        System.out.println("A杯:" + bb1 + "   B杯:" + bb2 + "   C杯:" + bb3);        //当其中一个杯的酒量等于目标酒量完成        if (bb1 == m || bb2 == m || bb3 == m) {            System.out.println("find the bottle");            return;        }        if (bb2 != 0 && bb3 != C) {// (2)当B杯不为空、C杯未满(bb2!=0 && bb3!=C)时,从B杯分一次或多次倒满C杯。            if (bb2 + bb3 <= C) {// 倒不满C杯                backBottle(bb1, 0, bb2 + bb3);            } else {                backBottle(bb1, bb2 - (C - bb3), C);            }        } else if (bb3 == C) {// (3)当C杯满了(bb3==C)时,从C杯倒回A瓶。            if (bb3 + bb1 <= A) {// 说明倒完后A杯没满                backBottle(bb1 + bb3, bb2, 0);            } else {                backBottle(A, bb2, bb3 - (A - bb1));            }        } else if (bb2 == 0) {// (1)当B杯空(bb2=0)时,从A杯往B杯里倒酒。            if (bb1 >= B) {                backBottle(bb1 - B, B, bb3);            } else {                backBottle(0, bb1, bb3);            }        }    }    public static void main(String[] args) {        ShareWine shareWine = new ShareWine();        shareWine.backBottle(12, 0, 0);    }}
0 0
原创粉丝点击