給你一個裝滿水的 8 升滿壺和兩個分別是 5 升、3 升的空壺,請想個優(yōu)雅的辦法,使得其中一個水壺恰好裝 4 升水,每一步的操作只能是倒空或倒?jié)M。

- 手動推算每種情況
每走一步,杯中不重復的狀態(tài)變化

- 實現(xiàn)代碼
import JAVA.util.ArrayList;
import java.util.List;
// 水壺問題
public class Kettle {
private static class Status {
int[] kettles = new int[3];
Status(int k0, int k1, int k2) {
kettles[0] = k0;
kettles[1] = k1;
kettles[2] = k2;
}
Status(Status status) {
kettles[0] = status.kettles[0];
kettles[1] = status.kettles[1];
kettles[2] = status.kettles[2];
}
public boolean isSuccess(int code) {
return kettles[0] == code || kettles[1] == code || kettles[2] == code;
}
@Override
public boolean equals(Object obj) {
Status status = (Status) obj;
return kettles[0] == status.kettles[0] && kettles[1] == status.kettles[1] && kettles[2] == status.kettles[2];
}
}
static int successCode = 4; // 最終需要包含的狀態(tài)
static int[] capitals = {8, 5, 3}; // 水壺容量
static Status initStatus = new Status(8, 0, 0); // 初始值
static List<Status> statuses = new ArrayList<Status>() {{ // 初始數(shù)組
add(new Status(initStatus));
}};
static List<List<Status>> results = new ArrayList<>(); // 結(jié)果數(shù)組
static void iterate(Status status, List<Status> statuses) {
if (status.isSuccess(successCode)) {
results.add(new ArrayList<>(statuses));
return;
}
for (int i = 0; i < capitals.length; i++) {
for (int j = 0; j < capitals.length; j++) {
if (i == j) continue;
if (status.kettles[i] == 0 || status.kettles[j] == capitals[j]) continue;
int difference = Math.min(status.kettles[i], capitals[j] - status.kettles[j]);
status.kettles[i] -= difference;
status.kettles[j] += difference;
if (!statuses.contains(status)) {
statuses.add(new Status(status));
iterate(status, statuses);
statuses.remove(status);
}
status.kettles[i] += difference;
status.kettles[j] -= difference;
}
}
}
public static void main(String[] args) {
iterate(initStatus, statuses);
System.out.println("結(jié)果數(shù)量:" + results.size());
results.forEach(statuses -> {
statuses.forEach(status -> System.out.print(" -> " + status.kettles[0] + ", " + status.kettles[1] + ", " + status.kettles[2]));
System.out.println();
});
}
}