$end ) { $t = $start; $start = $end; $end = $t; } // すでに計算済なら・もしくはループ検出 if ( ($return = get_move_cost($start, $end)) !== FALSE ) { return $return; } // 探索開始 $minimum = FALSE; $move_cost[$start][$end] = FALSE; foreach ( $input_move_cost[$start] as $moveto => $cost ) { $return = move_point($moveto, $end); $minimum = my_min($return + intval($cost), $minimum); } $move_cost[$start][$end] = $minimum; return $move_cost[$start][$end]; } // $start から $end まで移動するコストを返却します function get_move_cost ( $start, $end ) { global $move_cost; // 移動元と移動先が一緒なら if ( $start == $end ) { return 0; } // 移動先より移動元のほうが後ろなら、ひっくり返す if ( $start > $end ) { $t = $start; $start = $end; $end = $t; } // すでに計算済ならそれを返却 if ( isset($move_cost[$start][$end]) ) { return $move_cost[$start][$end]; } // 未計算なら FALSE 、もしくはそもそも到達できない場合 else { return FALSE; } } function my_min ( $a, $b ) { if ( ($a === FALSE) && ($b === FALSE) ) { return FALSE; } if ( $a === FALSE ) { return $b; } if ( $b === FALSE ) { return $a; } return min($a, $b); }