1. 程式人生 > >資料結構與演算法之窮舉法

資料結構與演算法之窮舉法

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); } }