Esempio n. 1
0
/**
 * 数独を解く
 * @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);
    }
}
Esempio n. 2
0
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";
}