資料結構與演算法之窮舉法
阿新 • • 發佈:2019-02-16
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);
}
}