您的位置:首页 > 编程语言 > Java开发

java 实现N个女人过桥问题

2016-05-14 17:15 661 查看
题目描述:

N个女人过桥,夜间有一火把,每次最多过两个,必需带火把,过桥速度不一样。过去后必须回来一个人,把火把带回来。要求女人都过去,实现最小过桥时间。

如果4个女人过桥,时间为1,2,5,10,那么最小时间是17。

思路:

在未过桥中选最少时间的两个人过桥,当过桥后选最少时间的人返回,此时火把交给返回的人,同时对己过桥的人进行统计,当还有三人未过桥时(包含返的人),

让时间最大的两个人过桥,后将为把交给过桥后最少时间的再返回,最后两个最少时间的人过桥。

比如1,2,5,9,10, 那么1,2 先过1回来,1,5过,1回来,剩3个的时候, 9,10过,2回来, 1,2过,OK

代码实现:

package NWomenCrossBridge;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;

import org.apache.log4j.Logger;

public class NWomenCrossBridge {

private Logger logger = Logger.getLogger(NWomenCrossBridge.class);
private static NWomenCrossBridge instance = null;
private static Stack<Integer> UnCross = null;
private static Queue<Integer> Crossed = null;
private static int timeCost = 0;

public static NWomenCrossBridge getInstance(Integer... needTime) {
if(instance == null) {
return new NWomenCrossBridge(needTime);
}
return instance;
}

private NWomenCrossBridge(Integer... needTime) {
UnCross = new Stack<Integer>();
Crossed = new LinkedList<Integer>();//队列
setTime(needTime);
}

public void setTime(Integer... needTime) {
List<Integer> list = new ArrayList<Integer>();
list = Arrays.asList(needTime);
Collections.sort(list);
for(int i=list.size()-1;i>=0;i--)
UnCross.push(list.get(i));
}

public void crossBridge() {
Integer first = null;
Integer second = null;
Integer third = null;
int count = 1;
while(UnCross.size()>0) {
if(UnCross.size()>3) {
first = UnCross.pop();
second = UnCross.pop();
Crossed.offer(second);
timeCost += second;//过桥时间
UnCross.push(first);
timeCost += first; //回程时间
logger.info("第" + count + "次,"+ first +" 和  " + second + " 同过桥, " + first + " 返回");
count++;
} else if(UnCross.size() == 3){
first = UnCross.pop();
second = UnCross.pop();
third = UnCross.pop();
Crossed.offer(second);
Crossed.offer(third);
timeCost += third;//过桥时间
Integer goBack = Crossed.poll();//已过桥的,把其中最小的拿出来返回
timeCost += goBack;//回程时间
logger.info("第" + count + "次,"+ second +" 和  " + third + " 同过桥, " + goBack + " 返回");
count++;
Crossed.offer(first);
Crossed.offer(goBack);
timeCost += goBack;
logger.info("第" + count + "次,"+ first +" 和  " + goBack + " 同过桥");
}
}
logger.info("总过桥次数为: " + count + " 总过桥时间为: " + timeCost);
}

public static void main(String[] args) {
NWomenCrossBridge nWomenCrossBridge = NWomenCrossBridge.getInstance(1,2,5,9,10);  //时间指定,可以无序
nWomenCrossBridge.crossBridge();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: