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