Home > Article > Backend Development > How to solve Sudoku problems in PHP
This article mainly introduces the Sudoku solving problem implemented in PHP, involving the traversal, comparison, judgment, operation and other related operation skills of PHP arrays and strings. Friends in need can refer to the examples of this article
Describes the Sudoku solving problem implemented in PHP. Share it with everyone for your reference, the details are as follows:
1. Sudoku problem description:
For the given two-dimensional array of numbers, each row and each column is required Numbers cannot be repeated.
2. Implementation code:
<?php /* 数独求解程序 * Created on 2017-4-18 * */ class Sudoku { var $matrix; function __construct($arr = null) { if ($arr == null) { $this->clear(); } else { $this->matrix = $arr; } } function clear() { for($i=0; $i<9; $i++) { for($j=0; $j<9; $j++) { $this->matrix[$i][$j] = array(); for ($k = 1; $k <= 9; $k++) { $this->matrix[$i][$j][$k] = $k; } } } } function setCell($row, $col, $value){ $this->matrix[$row][$col] = array($value => $value); //row for($i = 0; $i < 9; $i++){ if($i != $col){ if(! $this->removeValue($row, $i, $value)) { return false; } } } //col for($i = 0; $i < 9; $i++){ if($i != $row){ if(! $this->removeValue($i, $col, $value)) { return false; } } } //square $rs=intval($row / 3) * 3; $cs=intval($col / 3) * 3; for($i = $rs; $i < $rs + 3; $i++){ for($j = $cs; $j < $cs + 3; $j++){ if($i != $row && $j != $col){ if(! $this->removeValue($i, $j, $value)) return false; } } } return true; } function removeValue($row, $col, $value) { $count = count($this->matrix[$row][$col]); if($count == 1){ $ret = !isset($this->matrix[$row][$col][$value]); return $ret; } if (isset($this->matrix[$row][$col][$value])) { unset($this->matrix[$row][$col][$value]); if($count - 1 == 1) { return $this->setCell($row, $col, current($this->matrix[$row][$col])); } } return true; } function set($arr) { for ($i = 0; $i < 9; $i++) { for ($j = 0; $j < 9; $j++) { if ($arr[$i][$j] > 0) { $this->setCell($i, $j, $arr[$i][$j]); } } } } function dump() { for($i = 0; $i < 9; $i++){ for($j = 0; $j < 9; $j++){ $c = count($this->matrix[$i][$j]); if($c == 1){ echo " ".current($this->matrix[$i][$j])." "; } else { echo "(".$c.")"; } } echo "\n"; } echo "\n"; } function dumpAll() { for($i = 0; $i < 9; $i++){ for($j = 0; $j < 9; $j++){ echo implode('', $this->matrix[$i][$j]), "\t"; } echo "\n"; } echo "\n"; } function calc($data) { $this->clear(); $this->set($data); $this->_calc(); $this->dump(); } function _calc() { for($i = 0; $i < 9; $i++){ for($j = 0; $j < 9; $j++){ if(count($this->matrix[$i][$j]) == 1) { continue; } foreach($this->matrix[$i][$j] as $v){ $flag = false; $t = new Sudoku($this->matrix); if(!$t->setCell($i, $j, $v)){ continue; } if(!$t->_calc()){ continue; } $this->matrix = $t->matrix; return true; } return false; } } return true; } } $sd=new Sudoku; $sd->calc(array( array(0,5,0,0,0,6,0,9,0), array(0,4,7,0,8,2,6,0,0), array(0,8,0,0,0,7,0,5,2), array(7,0,1,0,3,4,0,0,6), array(0,3,0,0,2,0,0,8,0), array(2,0,0,0,0,1,9,0,4), array(4,7,0,1,0,0,0,6,0), array(0,0,9,4,6,0,3,7,0), array(0,1,0,2,0,0,0,4,0), )); $sd->calc(array( array(1,0,0,0,0,6,9,0,0), array(0,0,0,9,0,0,0,0,5), array(2,0,0,1,0,0,0,0,3), array(0,0,5,3,0,7,0,2,0), array(3,0,0,6,0,0,0,0,1), array(0,1,0,4,0,0,8,0,0), array(9,0,0,0,0,2,0,0,7), array(5,0,0,0,0,9,0,0,0), array(0,0,3,7,0,0,0,0,4), )); $sd->calc(array( array(7,0,0,1,0,0,0,0,5), array(0,0,6,0,4,0,0,8,0), array(0,0,1,0,0,0,0,0,0), array(0,6,0,0,8,0,0,0,3), array(0,8,0,0,0,9,0,7,0), array(1,0,0,0,0,0,0,5,0), array(0,0,0,0,0,0,9,0,0), array(0,4,0,0,3,0,1,0,0), array(9,0,0,0,0,7,0,0,2), )); $sd->calc(array( array(0,5,0,0,0,0,0,2,0), array(0,0,3,1,0,0,5,0,0), array(0,0,6,0,0,8,0,0,0), array(6,0,0,0,0,0,0,1,0), array(8,0,0,6,0,0,0,0,4), array(0,3,0,0,0,9,0,0,7), array(0,0,0,5,0,0,3,0,0), array(0,0,8,0,0,6,9,0,0), array(0,9,0,0,0,0,0,7,0), )); ?>
The running results are as follows:
1 5 2 3 4 6 7 9 8 9 4 7 5 8 2 6 1 3 3 8 6 9 1 7 4 5 2 7 9 1 8 3 4 5 2 6 5 3 4 6 2 9 1 8 7 2 6 8 7 5 1 9 3 4 4 7 3 1 9 8 2 6 5 8 2 9 4 6 5 3 7 1 6 1 5 2 7 3 8 4 9 1 3 7 2 5 6 9 4 8 4 6 8 9 7 3 2 1 5 2 5 9 1 8 4 6 7 3 6 8 5 3 1 7 4 2 9 3 9 4 6 2 8 7 5 1 7 1 2 4 9 5 8 3 6 9 4 6 5 3 2 1 8 7 5 7 1 8 4 9 3 6 2 8 2 3 7 6 1 5 9 4 7 3 8 1 9 6 4 2 5 2 9 6 3 4 5 7 8 1 4 5 1 2 7 8 3 9 6 5 6 9 7 8 4 2 1 3 3 8 2 5 1 9 6 7 4 1 7 4 6 2 3 8 5 9 6 2 7 4 5 1 9 3 8 8 4 5 9 3 2 1 6 7 9 1 3 8 6 7 5 4 2 9 5 1 3 6 7 4 2 8 7 8 3 1 4 2 5 6 9 2 4 6 9 5 8 7 3 1 6 2 9 4 7 5 8 1 3 8 7 5 6 1 3 2 9 4 1 3 4 2 8 9 6 5 7 4 6 7 5 9 1 3 8 2 3 1 8 7 2 6 9 4 5 5 9 2 8 3 4 1 7 6
The above is the entire content of this article, I hope it will be helpful to everyone's study.
Related recommendations:
PHPExplanation of the definition and binding method of behavior in the Yii framework_php skills
PHP Method to remove the behavior bound to a component in the Yii framework_php tips
##
The above is the detailed content of How to solve Sudoku problems in PHP. For more information, please follow other related articles on the PHP Chinese website!