四个女人过桥,夜间有一火把,每次最多过两个,必需带火把,
过桥速度不一样
no.1 1min
no.2 2min
no.3 5min
no.4 10min
两个人过用最慢一个的速度,火把不能扔
如何在17min内四个女人都过桥
import java.util.ArrayList;
import java.util.List;
public class GoRriver {
List<Woman> leftWomanList = null;
List<Woman> rightWomanList = null;
int times = 0;
boolean hb = true;// 表示火把在左边
final int size = 4;
public GoRriver() {
leftWomanList = new ArrayList<Woman>(size);
rightWomanList = new ArrayList<Woman>(size);
leftWomanList.add(new Woman(1, 1));
leftWomanList.add(new Woman(2, 2));
leftWomanList.add(new Woman(3, 5));
leftWomanList.add(new Woman(4, 10));
}
void go() {
while (leftWomanList.size() > 0) {
if (rightWomanList.size() == 0) {
goMinRight();
} else {
if (hb) {// 火把在左边
Woman leftMinWoman = getMinWoman(leftWomanList);
Woman rightMinWoman = getMinWoman(rightWomanList);
if (leftMinWoman.getTime() < rightMinWoman.getTime()) {// 如果左岸过桥时间最短的比右岸过桥时间最短的还短,则派两个时间最长的妇女过岸
goMaxRight();
} else {
goMinRight();
}
} else {// 火把在右边
backLeft();
}
}
}
}
private void backLeft() {
Woman minWoman = getMinWoman(rightWomanList);
System.out.println("派妇女:" + minWoman.getId() + "," + minWoman.getTime() + "送火把");
rightWomanList.remove(minWoman);
leftWomanList.add(minWoman);
times += minWoman.getTime();
hb = true;
System.out.println("================");
}
private void goMaxRight() {
Woman firstWoman = getMaxWoman(leftWomanList);
leftWomanList.remove(firstWoman);
System.out.println("派妇女:" + firstWoman.getId() + "," + firstWoman.getTime() + "去对岸");
Woman secondWoman = getMaxWoman(leftWomanList);
leftWomanList.remove(secondWoman);
System.out.println("派妇女:" + secondWoman.getId() + "," + secondWoman.getTime() + "去对岸");
rightWomanList.add(firstWoman);
rightWomanList.add(secondWoman);
times += firstWoman.getTime();
hb = false;
}
private void goMinRight() {
Woman firstWoman = getMinWoman(leftWomanList);
leftWomanList.remove(firstWoman);
System.out.println("派妇女:" + firstWoman.getId() + "," + firstWoman.getTime() + "去对岸");
Woman secondWoman = getMinWoman(leftWomanList);
leftWomanList.remove(secondWoman);
System.out.println("派妇女:" + secondWoman.getId() + "," + secondWoman.getTime() + "去对岸");
rightWomanList.add(firstWoman);
rightWomanList.add(secondWoman);
times += secondWoman.getTime();
hb = false;
}
Woman getWoman(List<Woman> list, int id) {
for (Woman woman : list) {
if (woman.getId() == id) {
return woman;
}
}
return null;
}
Woman getMinWoman(List<Woman> list) {
Woman minWoman = list.get(0);
for (Woman woman : list) {
if (woman.getTime() < minWoman.getTime()) {
minWoman = woman;
}
}
return minWoman;
}
Woman getMaxWoman(List<Woman> list) {
Woman maxWoman = list.get(0);
for (Woman woman : list) {
if (woman.getTime() > maxWoman.getTime()) {
maxWoman = woman;
}
}
return maxWoman;
}
public static void main(String[] args) {
GoRriver goRevier = new GoRriver();
goRevier.go();
System.out.println("=================");
System.out.println("总共花费:"+goRevier.times);
}
}