小明家必须要过一座桥。小明过桥最快要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);