<?php
class SudokuSolver
{
protected $sudokuColumns;
public function __construct ($sudoku)
{
$this->sudokuColumns = $sudoku;
}
protected static function getNumbers ()
{
return array_flip(str_split("123456789"));
}
// could be static as well
public function printOut ($sudoku)
{
foreach ($sudoku as $column) {
foreach ($column as $cell) {
echo "|";
if (null !== $cell) {
echo $cell;
} else {
echo " ";
}
}
echo "|\n";
}
}
public function solve()
{
if (!$this->checkConsistenz()) {
throw new Exception("inconsistent data!");
}
}
protected function checkConsistenz ()
{
$columns = $this->sudokuColumns;
foreach ($columns as $columnIndex => $column) {
if (!$this->checkLine($columnIndex,$column)) {
return false;
}
}
// check rows -> own method
$rows = array();
foreach ($columns as $columnIndex => $column) {
foreach ($column as $rowIndex => $cell) {
$rows[$rowIndex][$columnIndex] = $cell;
}
//$this->printOut($rows);
}
foreach ($rows as $rowIndex => $row) {
if (!$this->checkLine($rowIndex,$row)) {
return false;
}
}
// check field -> own method
$fields = array();
foreach ($columns as $columnIndex => $column) {
foreach ($column as $rowIndex => $cell) {
//echo "(3 * ($columnIndex / 3)) + ($rowIndex / 3) = ". (3 * ($columnIndex / 3)) ." + ". ($rowIndex / 3) ."\n";
$fields[(3 * intval($columnIndex / 3)) + intval($rowIndex / 3)][] = $cell;
}
}
//print_r($fields);
foreach ($rows as $rowIndex => $row) {
if (!$this->checkLine($rowIndex,$row)) {
return false;
}
}
return true;
}
protected function checkLine ($rowIndex, $row)
{
$numbers = self::getNumbers();
echo "checking $rowIndex..\n";
foreach ($row as $column) {
if (null === $column) {
continue;
}
//echo "$column , $numbers\n" . var_export(strpos($numbers,$column),true);
if (!array_key_exists($column,$numbers))
{
return false;
}
unset($numbers[$column]);
}
return true;
}
}
$sudoku = array();
$sudoku[] = array(null,3,null, null,null,null, null,null,null);
$sudoku[] = array(null,null,null, 1,9,5, null,null,null);
$sudoku[] = array(null,null,8, null,null,null, null,6,null);
$sudoku[] = array(8,null,null, null,6,null, null,null,null);
$sudoku[] = array(4,null,null, 8,null,null, null,null,1);
$sudoku[] = array(null,null,null ,null,2,null, null,null,null);
$sudoku[] = array(null,6,null, null,null,null, 2,8,null);
$sudoku[] = array(null,null,null, 4,1,9, null,null,5);
$sudoku[] = array(null,null,null, null,null,null, null,7,null);
$sudokuSolver = new SudokuSolver($sudoku);
//$sudokuSolver->printOut($sudoku);
$sudokuSolver->solve($sudoku);
- Output for git.master, git.master_jit, rfc.property-hooks
- checking 0..
checking 1..
checking 2..
checking 3..
checking 4..
checking 5..
checking 6..
checking 7..
checking 8..
checking 0..
checking 1..
checking 2..
checking 3..
checking 4..
checking 5..
checking 6..
checking 7..
checking 8..
checking 0..
checking 1..
checking 2..
checking 3..
checking 4..
checking 5..
checking 6..
checking 7..
checking 8..
This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.
Active branches
Archived branches
Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page
preferences:
38.21 ms | 402 KiB | 8 Q