function solve($board) { // get empty spaces, find one with one choice, set it , rinse and repeat while (!filled($board) && !validSolution($board)) { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { if ($board[$i][$j] == 0) { $valid = validValuesFor($board, [$i, $j]); if (count($valid) == 1) { $board[$i][$j] = $valid[0]; } } } } } return $board; }
public function test_validValuesFor() { $this->assertEquals([], validValuesFor([[5, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9]], [0, 0])); $this->assertEquals([1, 2, 4], validValuesFor([[5, 3, 0, 0, 7, 0, 0, 0, 0], [6, 0, 0, 1, 9, 5, 0, 0, 0], [0, 9, 8, 0, 0, 0, 0, 6, 0], [8, 0, 0, 0, 6, 0, 0, 0, 3], [4, 0, 0, 8, 0, 3, 0, 0, 1], [7, 0, 0, 0, 2, 0, 0, 0, 6], [0, 6, 0, 0, 0, 0, 2, 8, 0], [0, 0, 0, 4, 1, 9, 0, 0, 5], [0, 0, 0, 0, 8, 0, 0, 7, 9]], [0, 2])); }