分酒问题

来源:互联网 发布:金士顿加密软件 编辑:程序博客网 时间:2024/04/27 19:49
import java.util.HashSet;import java.util.Set;class OilStatus {static int[] full = { 12, 8, 5 };int[] v = new int[3];OilStatus from; // 从哪个状态来public OilStatus(int a, int b, int c) {v[0] = a;v[1] = b;v[2] = c;}//操作方法public Set op() {Set rt = new HashSet();for (int i = 0; i < v.length; i++)for (int j = 0; j < v.length; j++) {if (i == j)continue;//不可能倒给自己if (v[i] == 0)continue;//自身是空的,不能倒if (v[j] == full[j])continue;//目标满了,也不能倒OilStatus t = new OilStatus(v[0], v[1], v[2]);t.from = this;t.v[j] += t.v[i];t.v[i] = 0;if (t.v[j] > full[j]) {t.v[i] = t.v[j] - full[j];t.v[j] = full[j];}rt.add(t);}return rt;}public String toString() {return "<" + v[0] + "," + v[1] + "," + v[2] + ">";}public int hashCode() {return 100;}public boolean equals(Object x) {OilStatus x2 = (OilStatus) x;return v[0] == x2.v[0] && v[1] == x2.v[1] && v[2] == x2.v[2];}public boolean has(int x) {return v[0] == x || v[1] == x || v[2] == x;}public OilStatus getFrom() {return from;}}public class Wine {public static void main(String[] args) {Set set = new HashSet(); // 存放所有状态set.add(new OilStatus(12, 0, 0));for (;;) {Set new_set = new HashSet();for (Object x : set) {OilStatus x2 = (OilStatus) x;//恢复身份Set t = x2.op();new_set.addAll(t);}if (set.containsAll(new_set))break;//如果新状态全都包在老状态里,便利结束set.addAll(new_set);//否则,加进去}// System.out.println(set);for (Object k : set) {OilStatus k2 = (OilStatus) k;if (k2.has(6)) {while (k2 != null) {System.out.println(k2);k2 = k2.getFrom();}break;}}}}


<1,6,5><1,8,3><9,0,3><9,3,0><4,3,5><4,8,0><12,0,0>


0 0