一贱书生

A. 18
B. 17
C. 19
D. 16

二、思路

1、大师兄和二师兄过桥，算二师兄的时间也就是2分钟
2、大师兄独自拿手电回来 1分钟
3、三师弟和师傅那手电过桥，算师傅的时间也就是10分钟
4、二师弟拿手电回来 2分钟
5、最后大师兄和二师弟过桥 2分钟

三、编程解决

2016年10月7日01:39:55

``````import java.util.ArrayList;

public class Pilgrimage {

final static int times[] = { 1, 2, 5, 10 };// 花费时间
final static String names[] = { "大师兄", "二师兄", "三师兄", "师傅" };// 人物

public static void main(String[] args) {
Integer other_bridges[] = { 0, 0, 0, 0 };// 桥另一边
Integer bridges[] = { 1, 1, 1, 1 };// 当前桥这边 ，1表示存在，0表示不在

// 开始递归
loop(bridges, other_bridges, 0, new StringBuffer());
}

private static void loop(Integer[] bridges, Integer[] other_bridges,
int time, StringBuffer msg) {
ArrayList<Integer> positions = new ArrayList<Integer>();// 记录还在起始端人的下标
for (int i = 0; i < bridges.length; i++) {
if (bridges[i] == 1) {
}
}
int len = positions.size();

for (int i = 0; i < len - 1; i++) {
for (int j = i + 1; j < len; j++) { // 循环取结合
// 记录状态
Integer[] zt_bridges = bridges.clone();
Integer[] zt_other_bridges = other_bridges.clone();
int zt_time = time;
StringBuffer zt_msg = new StringBuffer(msg);

// 过桥---------
time += times[positions.get(j)];// 花费时间直接取最大的
move(bridges, other_bridges, 1, positions.get(i));
move(bridges, other_bridges, 1, positions.get(j));
msg.append(" 过桥:" + names[positions.get(i)] + "&"
+ names[positions.get(j)]);
// System.out.print(" 过桥:" + names[positions.get(i)] + "_"
// + names[positions.get(j)]);

// 回来接人------
if (isend(other_bridges)) {
msg.append(" 总共花费:" + time);
System.out.println(msg.toString());
// System.out.println(" 总共花费:" + time);
return;
}
int k = 0;
for (int ii = 0; ii < other_bridges.length; ii++) {// 选择最快的回来
if (other_bridges[ii] == 1) {
k = ii;
break;
}
}
time += times[k];
move(bridges, other_bridges, 0, k);
msg.append("  回来:" + names[k]+"  ***  ");
// System.out.print(" 回来:" + names[k]);

// 继续循环遍历
loop(bridges.clone(), other_bridges.clone(), time,
new StringBuffer(msg));

// 还原状态
bridges = zt_bridges;
other_bridges = zt_other_bridges;
time = zt_time;
msg = zt_msg;
}
}
}

/**
* 移动的那个人
*
* @param bridges
* @param other_bridges
* @param direction
*            方向
* @param position
*/
private static void move(Integer[] bridges, Integer[] other_bridges,
int direction, int position) {
if (direction == 1) {// 往另一端走
bridges[position] = 0;
other_bridges[position] = 1;
} else {// 回来接人走
bridges[position] = 1;
other_bridges[position] = 0;
}
}

// 判断是否已经结束了
// 当other_bridges {1,1,1,1}表示结束
private static boolean isend(Integer[] other_bridges) {
for (int i : other_bridges) {
if (i == 0)
return false;
}
return true;
}

}``````

一贱书生

90 道名企笔试和算法题 (含答题讨论)

（点击上方公众号，可快速关注） 节选自「算法爱好者」微信公号的精选算法题和名企笔试题。 问：如何获取题目列表？ 答：① 长摁二维码关注「算法爱好者」，② 然后给它发送 名企笔试 或 算法...

Python开发者
2018/01/21
0
0

Gavin__Zhou
2017/05/01
0
0

2013/01/06
156
0

曾经一个朋友建议我去麦当劳买完套餐，然后去KFC吃，看看会有什么效果。我当时的一次反应是会不会被KFC的工作人员打呢？这是赤裸裸的砸场子唉，就好像07年我最早研究SEO的时候，在谷歌搜...

2016/05/23
32
0

mickelfeng
2013/10/12
0
0

Jenkins系列_插件安装及报错处理

shzwork

2
0
mysql mysql的所有查询语句和聚合函数（整理一下，忘记了可以随时看看）

edison_kwok

9
0

3
0

2
0

mbzhong

4
0