在一家公司笔试碰到的,当时由于时间紧没有做出来,估计没有什么希望了。回到家里写了一个完整的程序,希望对以后的人有所帮助吧。(注 网上也有一些类似的例子,感觉那些写的不是很好,不是很切题)
问题描述:在漆黑的夜里,五位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无 论如何也不敢过桥去的。不幸的是,五个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是1、2、5、8、10分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这四人尽快过桥,并用java程序描述。
程序如下:
public class PastBridge ... { public static void main(String[] args) ...{ // 假设数组从小到大排序 int[] example1 = ...{ 1, 2, 5, 10 }; String[] strExample1 = ...{ "A", "B", "C", "D" }; int[] example2 = ...{ 1, 10, 11, 12}; String[] strExample2 = ...{ "A", "B", "C", "D"}; int[] example3 = ...{ 1}; String[] strExample3 = ...{ "A"}; int[] example4 = ...{ 1,3}; String[] strExample4 = ...{ "A","B"}; int[] example5 = ...{ 1,3,6}; String[] strExample5 = ...{ "A","B","C"}; GoBridge(example1, strExample1); GoBridge(example2, strExample2); GoBridge(example3, strExample3); GoBridge(example4, strExample4); GoBridge(example5, strExample5); } /** *//** * 计算所有人过桥的总用时 * * @param personTimes * 过桥人各自所用时间组成的数组 * @param personNames * 过桥人名称组成的数组 */ private static void GoBridge(int[] personTimes, String[] personNames) ...{ int personsNum = personTimes.length; if(personsNum==1)...{ System.out.println("总共用时=" + personTimes[0]); return; } if(personsNum==2)...{ System.out.println("总共用时=" + personTimes[1]); return; } int quickest = personTimes[0];// 用时最少的人 int quicker = personTimes[1]; // 用时第二少的人 int totalTimes = 0;// 总共用时 // 将执行逻辑按是否为偶数分成两种情况 boolean isEvenNum = personsNum % 2 == 0; if (isEvenNum) ...{// 为偶数 for (int i = personTimes.length - 1; i >= 2;) ...{ totalTimes +=goBridgerControl(i, personNames,personTimes); i = i - 2; } totalTimes += quicker; System.out.println(personNames[0] + "," + personNames[1] + "过去 用时:"+personTimes[1]); } else ...{// 为奇数 for (int i = personTimes.length - 1; i > 3;) ...{ totalTimes +=goBridgerControl(i, personNames,personTimes); i = i - 2; } totalTimes += personTimes[2]; totalTimes += quicker + quickest; System.out.println(personNames[0] + "," + personNames[2] + "过去 用时:"+personTimes[2]); System.out.println(personNames[0] + "回来 用时:"+personTimes[0]); System.out.println(personNames[0] + "," + personNames[1] + "过去 用时:"+personTimes[1]); } System.out.println("总共用时=" + totalTimes); } /** *//** * 执行路径的控制选择 * @param i * @param personNames * @param personTimes * @return */ private static int goBridgerControl(int i, String[] personNames,int[] personTimes) ...{ if(personTimes[1]*2<personTimes[0]+personTimes[i-1])...{ return goBridgerWith2(i, personNames,personTimes); }else...{ return goBridgerWith1(i, personNames,personTimes); } } /** *//** * 最快和次最快的人陪同过桥 * @param i * @param personNames * @param personTimes * @return */ private static int goBridgerWith2(int i, String[] personNames,int[] personTimes) ...{ System.out.println(personNames[0] + "," + personNames[1] + "过去 用时:"+personTimes[1]); System.out.println(personNames[0] + "回来 用时:"+personTimes[0]); System.out.println(personNames[i] + "," + personNames[i - 1] + "过去 用时:"+personTimes[i]);; System.out.println(personNames[1] + "回来 用时:"+personTimes[1]); int roundedTimes = personTimes[1] * 2 + personTimes[0];// 用时最少的两位往返的时间和 int atotalTimes=0; atotalTimes+= personTimes[i]; atotalTimes+= roundedTimes; return atotalTimes; } /** *//** * 最快的人陪同过桥 * @param i * @param personNames * @param personTimes * @return */ private static int goBridgerWith1(int i, String[] personNames,int[] personTimes) ...{ System.out.println(personNames[0] + "," + personNames[i] + "过去 用时:"+personTimes[i]); System.out.println(personNames[0] + "回来 用时:"+personTimes[0]); System.out.println(personNames[0] + "," + personNames[i - 1] + "过去 用时:"+personTimes[i-1]);; System.out.println(personNames[0] + "回来 用时:"+personTimes[0]); int atotalTimes=0; atotalTimes+= personTimes[i]; atotalTimes+= personTimes[i-1]; atotalTimes+= personTimes[0]*2; return atotalTimes; }}
如用更好的方式请告诉我,谢谢