1 数独求解程序 php版 2 3 <?php 4 class Sudoku { 5 var $matrix; 6 7 function __construct($arr = null) { 8 if ($arr == null) { 9 $this->clear(); 10 } else { 11 $this->matrix = $arr; 12 } 13 } 14 15 function clear() { 16 for($i=0; $i<9; $i++) { 17 for($j=0; $j<9; $j++) { 18 $this->matrix[$i][$j] = array(); 19 for ($k = 1; $k <= 9; $k++) { 20 $this->matrix[$i][$j][$k] = $k; 21 } 22 } 23 } 24 } 25 26 function setCell($row, $col, $value){ 27 $this->matrix[$row][$col] = array($value => $value); 28 //row 29 for($i = 0; $i < 9; $i++){ 30 if($i != $col){ 31 if(! $this->removeValue($row, $i, $value)) { 32 return false; 33 } 34 } 35 } 36 //col 37 for($i = 0; $i < 9; $i++){ 38 if($i != $row){ 39 if(! $this->removeValue($i, $col, $value)) { 40 return false; 41 } 42 } 43 } 44 //square 45 $rs=intval($row / 3) * 3; 46 $cs=intval($col / 3) * 3; 47 48 for($i = $rs; $i < $rs + 3; $i++){ 49 for($j = $cs; $j < $cs + 3; $j++){ 50 if($i != $row && $j != $col){ 51 if(! $this->removeValue($i, $j, $value)) 52 return false; 53 } 54 } 55 } 56 return true; 57 } 58 59 function removeValue($row, $col, $value) { 60 $count = count($this->matrix[$row][$col]); 61 if($count == 1){ 62 $ret = !isset($this->matrix[$row][$col][$value]); 63 return $ret; 64 } 65 if (isset($this->matrix[$row][$col][$value])) { 66 unset($this->matrix[$row][$col][$value]); 67 if($count - 1 == 1) { 68 return $this->setCell($row, $col, current($this->matrix[$row][$col])); 69 } 70 } 71 return true; 72 } 73 74 function set($arr) { 75 for ($i = 0; $i < 9; $i++) { 76 for ($j = 0; $j < 9; $j++) { 77 if ($arr[$i][$j] > 0) { 78 $this->setCell($i, $j, $arr[$i][$j]); 79 } 80 } 81 } 82 } 83 84 function dump() { 85 for($i = 0; $i < 9; $i++){ 86 for($j = 0; $j < 9; $j++){ 87 $c = count($this->matrix[$i][$j]); 88 if($c == 1){ 89 echo " ".current($this->matrix[$i][$j])." "; 90 } else { 91 echo "(".$c.")"; 92 } 93 } 94 echo " "; 95 } 96 echo " "; 97 } 98 99 function dumpAll() { 100 for($i = 0; $i < 9; $i++){ 101 for($j = 0; $j < 9; $j++){ 102 echo implode('', $this->matrix[$i][$j]), " "; 103 } 104 echo " "; 105 } 106 echo " "; 107 } 108 109 function calc($data) { 110 $this->clear(); 111 $this->set($data); 112 $this->_calc(); 113 $this->dump(); 114 } 115 116 function _calc() { 117 for($i = 0; $i < 9; $i++){ 118 for($j = 0; $j < 9; $j++){ 119 if(count($this->matrix[$i][$j]) == 1) { 120 continue; 121 } 122 foreach($this->matrix[$i][$j] as $v){ 123 $flag = false; 124 $t = new Sudoku($this->matrix); 125 if(!$t->setCell($i, $j, $v)){ 126 continue; 127 } 128 if(!$t->_calc()){ 129 continue; 130 } 131 $this->matrix = $t->matrix; 132 return true; 133 } 134 return false; 135 } 136 } 137 return true; 138 } 139 } 140 141 $sd=new Sudoku; 142 $sd->calc(array( 143 array(0,5,0,0,0,6,0,9,0), 144 array(0,4,7,0,8,2,6,0,0), 145 array(0,8,0,0,0,7,0,5,2), 146 array(7,0,1,0,3,4,0,0,6), 147 array(0,3,0,0,2,0,0,8,0), 148 array(2,0,0,0,0,1,9,0,4), 149 array(4,7,0,1,0,0,0,6,0), 150 array(0,0,9,4,6,0,3,7,0), 151 array(0,1,0,2,0,0,0,4,0), 152 )); 153 154 $sd->calc(array( 155 array(1,0,0,0,0,6,9,0,0), 156 array(0,0,0,9,0,0,0,0,5), 157 array(2,0,0,1,0,0,0,0,3), 158 array(0,0,5,3,0,7,0,2,0), 159 array(3,0,0,6,0,0,0,0,1), 160 array(0,1,0,4,0,0,8,0,0), 161 array(9,0,0,0,0,2,0,0,7), 162 array(5,0,0,0,0,9,0,0,0), 163 array(0,0,3,7,0,0,0,0,4), 164 )); 165 166 $sd->calc(array( 167 array(7,0,0,1,0,0,0,0,5), 168 array(0,0,6,0,4,0,0,8,0), 169 array(0,0,1,0,0,0,0,0,0), 170 array(0,6,0,0,8,0,0,0,3), 171 array(0,8,0,0,0,9,0,7,0), 172 array(1,0,0,0,0,0,0,5,0), 173 array(0,0,0,0,0,0,9,0,0), 174 array(0,4,0,0,3,0,1,0,0), 175 array(9,0,0,0,0,7,0,0,2), 176 )); 177 178 $sd->calc(array( 179 array(0,5,0,0,0,0,0,2,0), 180 array(0,0,3,1,0,0,5,0,0), 181 array(0,0,6,0,0,8,0,0,0), 182 array(6,0,0,0,0,0,0,1,0), 183 array(8,0,0,6,0,0,0,0,4), 184 array(0,3,0,0,0,9,0,0,7), 185 array(0,0,0,5,0,0,3,0,0), 186 array(0,0,8,0,0,6,9,0,0), 187 array(0,9,0,0,0,0,0,7,0), 188 ));