您的位置:首页 > 编程语言 > PHP开发

数独求解程序 php版

2017-07-03 15:59 555 查看
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 "\n";
95         }
96         echo "\n";
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]), "\t";
103             }
104             echo "\n";
105         }
106         echo "\n";
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 ));


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: