概述
在一家公司笔试碰到的,当时由于时间紧没有做出来,估计没有什么希望了。回到家里写了一个完整的程序,希望对以后的人有所帮助吧。(注 网上也有一些类似的例子,感觉那些写的不是很好,不是很切题)
问题描述:在漆黑的夜里,五位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无 论如何也不敢过桥去的。不幸的是,五个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是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;
}
}
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;
}
}
如用更好的方式请告诉我,谢谢
最后
以上就是欢呼荔枝为你收集整理的经典面试智力题(过桥问题)及完整java代码的全部内容,希望文章能够帮你解决经典面试智力题(过桥问题)及完整java代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复