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>