当前位置: 代码迷 >> J2SE >> 用JAVA实现倒水有关问题~ 求解!
  详细解决方案

用JAVA实现倒水有关问题~ 求解!

热度:39   发布时间:2016-04-23 19:37:23.0
用JAVA实现倒水问题~ 求解!!!
JAVA编程实现:现有三个水杯,容量分别为8L、5L、3L,但是只有容量为8L的水杯是装满水的,经过多次倒水后,使得三个杯子已装水量为4L、4L、0L

题目如上,有没有人知道其算法?
------解决思路----------------------
import java.util.ArrayList;
import java.util.List;

public class T {

private List<List<Integer>> histories = new ArrayList<List<Integer>>();
private List<Glass> glasses = new ArrayList<Glass>();

public static void main(String[] args) {
new T().test();
}

public void test() {
Glass a = new Glass(8);
a.size = 8;
Glass b = new Glass(5);
Glass c = new Glass(3);
glasses.add(a);
glasses.add(b);
glasses.add(c);
addHistory();
// 最终结果 4 4 0
while (true) {
Glass max = glasses.get(0);
Glass min = glasses.get(0);
for (int i = 1; i < glasses.size(); i++) {
Glass glass = glasses.get(i);
if (max.size < glass.size) {
max = glass;
}
if (min.size > glass.size) {
min = glass;
}
}
Glass mid = null;
for (Glass glass : glasses) {
if (glass != max && glass != min) {
mid = glass;
}
}
if (!pour(max, mid)) {
if (!pour(max, min)) {
if (!pour(mid, min)) {
if (!pour(mid, max)) {
if (!pour(min, max)) {
if (!pour(min, mid)) {
System.out.println("error");
}
}
}
}
}
}
addHistory();
System.out.println(a.size + ", " + b.size + ", " + c.size);
System.out.println("----------------");
if (a.size == 4 && b.size == 4 && c.size == 0) {
System.out.println("success");
return;
}
}
}

/**
 * 增加历史记录
 */
private void addHistory() {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(glasses.get(0).size);
list.add(glasses.get(1).size);
list.add(glasses.get(2).size);
histories.add(list);
}

/**
 * 是否史历史状态
 */
private boolean isHistory() {
for (List<Integer> history : histories) {
if (history.get(0) == glasses.get(0).size && history.get(1) == glasses.get(1).size && history.get(2) == glasses.get(2).size) {
return true;
}
}
return false;

}

/**
 * 倒水
 * @param from
 * @param to
 * @return
 */
public boolean pour(Glass from, Glass to) {
// 保留初始值
int temp1 = from.size;
int temp2 = to.size;
// form 中没水或 to 中已满
if (from.size == 0 
------解决思路----------------------
 to.capacity == to.size) {
return false;
}
int toResidual = to.capacity - to.size;
if (from.size >= toResidual) { // 对方倒满
to.size = to.capacity;
from.size -= toResidual;
} else { // 自己倒完
to.size += from.size;
from.size = 0;
}
if (isHistory()) {
// 还原
from.size = temp1;
to.size = temp2;
return false;
}
return true;
}

class Glass {

int capacity; // 容量
int size; // 拥有水量

public Glass(int capacity) {
this.capacity = capacity;
}

@Override
public String toString() {
return "Glass [capacity=" + capacity + ", size=" + size + "]";
}

}

}
  相关解决方案