• 数独求解程序 php版


      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 ));
  • 相关阅读:
    平时用到的Linux命令
    angular.element方法汇总
    CSS display:inline-block
    CSS:position:fixed使用(转)
    常见浏览器兼容性问题与解决方案【转】
    部分浏览器兼容问题
    php对应js math.random
    php stdclass转数组
    写在2016年末
    VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题
  • 原文地址:https://www.cnblogs.com/zqifa/p/php-shudu-1.html
Copyright © 2020-2023  润新知