小明家必须要过一座桥。小明过桥最快要1秒,小明的弟弟最快要3秒,小明的爸爸最快要6秒,小明的妈妈最快要8秒,小明的爷爷最快要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定。过桥时候是黑夜,所以必须有手电筒,小明家只有一个手电筒,而且手电筒的电池只剩30秒就将耗尽。小明一家该如何过桥,请写出详细过程
思路 最快的两个人负责来回传递手电筒,依次最慢的两人过去 右到左
function guoQiao(){
$arr = quick_sort(func_get_args()); // 排序 从小到大
echo '所有过桥人过桥时间,最快两人负责送电筒';
dump($arr);
$count = count($arr);
$path = '';
switch ($count) {
case 1:
echo '一个人过桥<br/>','耗时:',$arr[0];
return null;
case 2:
echo '两个人过桥<br/>','耗时:',$arr[1];
return null;
}
$tip = [$arr[0], $arr[1], 0]; // 0:都在右边 1:慢左快右
unset($arr[0]);
unset($arr[1]);
sort($arr);
$time = 0;
while ($arr || !$tip[2]) {
$time += getTime($tip, $arr, $path);
}
echo $path,'<br/>','耗时:',$time;
}
function getTime(&$tip, &$arr, &$path){
$count = count($arr);
if ($tip[2] == 0) {
$tip[2] = 1;
if ($count) {
$path .= '小明和弟弟到桥左边'.$tip[1].'<br/>小明送电筒到桥右边'.$tip[0].'<br/>';
return $tip[0] + $tip[1];
} else {
$path .= '小明和弟弟到桥左边'.$tip[1].'<br/>';
return $tip[1];
}
} else {
if ($count > 1) {
$tip[2] = 0;
$end = array_pop($arr);
array_pop($arr);
$path .= '桥右边最慢的两人到桥左边'.$end.'<br/>弟弟送电筒到桥右边'.$tip[1].'<br/>';
return $end + $tip[1];
} else {
$end = array_pop($arr);
$path .= '小明和最后一人到桥左边'.$end;
return $end;
}
}
}
guoQiao(1, 3, 6, 8, 12);