/** * 数独を解く * @param element_data 数独のデータが入った2次元配列 */ function solve_sudoku($element_data) { if (!is_array($element_data)) { return; } $is_solve_sudoku = true; // 3次元の候補配列に候補となり得る値を入れていく for ($x = 0; $x < 16; $x++) { for ($y = 0; $y < 16; $y++) { //echo "[".$x."][".$y."]".PHP_EOL; if ($element_data[$y][$x] != '') { $is_solve_sudoku = false; continue; } $condidate_element = get_candidate_element($x, $y, $element_data); if (count($condidate_element) == 1) { echo "[" . $x . "][" . $y . "]" . PHP_EOL; var_dump($condidate_element); $element_data[$y][$x] = $condidate_element[0]; print_sudoku($element_data); } } } if (!$is_solve_sudoku) { solve_sudoku($element_data); } }
function solve($sudoku) { $start = microtime(); $saved = array(); $saved_sud = array(); while (!is_solved_sudoku($sudoku)) { $x += 1; $next_move = scan_sudoku_for_unique($sudoku); if ($next_move == false) { $next_move = array_pop($saved); $sudoku = array_pop($saved_sud); } $what_to_try = next_random($next_move); $attempt = determine_random_possible_value($next_move, $what_to_try); if (count($next_move[$what_to_try]) > 1) { $next_move[$what_to_try] = remove_attempt($next_move[$what_to_try], $attempt); array_push($saved, $next_move); array_push($saved_sud, $sudoku); } $sudoku[$what_to_try] = $attempt; } $end = microtime(); $ms_start = explode(" ", $start); $ms_end = explode(" ", $end); $total_time = round($ms_end[1] - $ms_start[1] + $ms_end[0] - $ms_start[0], 2); echo "completed in {$x} steps in {$total_time} seconds"; echo print_sudoku($sudoku); echo "<br/>"; echo " Server 1"; }