sudoku breaker-php edition
Deducer class:
puzzle.php:
1<?php
2class Deducer
3{
4 private $array;
5 public function __construct($array)
6 {
7 $this->array=array();
8 for($row=0;$row<9;$row++)
9 {
10 for($column=0;$column<9;$column++)
11 {
12 $this->array[$row][$column]=$array[$row][$column];
13 }
14 }
15 }
16 private function isFinished()
17 {
18 for($row=0;$row<9;$row++)
19 {
20 for($column=0;$column<9;$column++)
21 {
22 if($this->array[$row][$column]==0)
23 {
24 return false;
25 }
26 }
27 }
28 return true;
29 }
30 public function deduceAll()
31 {
32 if($this->isFinished())
33 {
34 return;
35 }
36 for($row=0;$row<7;$row=$row+3)
37 {
38 for($column=0;$column<7;$column=$column+3)
39 {
40 if($this->reduceFromOneZone($this->array,$row,$column))
41 {
42 $this->deduceAll();
43 return;
44 }
45 }
46 }
47 for($row=0;$row<9;$row++)
48 {
49 if($this->reduceFromOneRow($this->array,$row))
50 {
51 $this->deduceAll();
52 return;
53 }
54 }
55 for($column=0;$column<9;$column++)
56 {
57 if($this->reduceFromOneColumn($this->array,$column))
58 {
59 $this->deduceAll();
60 return;
61 }
62 }
63 for($row=0;$row<7;$row=$row+3)
64 {
65 if($this->reduceFromThreeRows($this->array,$row,$row+2))
66 {
67 $this->deduceAll();
68 return;
69 }
70 }
71 for($column=0;$column<7;$column=$column+3)
72 {
73 if($this->reduceFromThreeColumns($this->array,$column,$column+2))
74 {
75 $this->deduceAll();
76 return;
77 }
78 }
79 }
80 public function deduceOnce()
81 {
82 for($row=0;$row<7;$row=$row+3)
83 {
84 for($column=0;$column<7;$column=$column+3)
85 {
86 if($this->reduceFromOneZone($this->array,$row,$column))
87 {
88 return;
89 }
90 }
91 }
92 for($row=0;$row<9;$row++)
93 {
94 if($this->reduceFromOneRow($this->array,$row))
95 {
96 return;
97 }
98 }
99 for($column=0;$column<9;$column++)
100 {
101 if($this->reduceFromOneColumn($this->array,$column))
102 {
103 return;
104 }
105 }
106 for($row=0;$row<7;$row=$row+3)
107 {
108 if($this->reduceFromThreeRows($this->array,$row,$row+2))
109 {
110 return;
111 }
112 }
113 for($column=0;$column<7;$column=$column+3)
114 {
115 if($this->reduceFromThreeColumns($this->array,$column,$column+2))
116 {
117 return;
118 }
119 }
120 }
121 private function reduceFromOneZone(&$array,$row,$column)
122 {
123 $startRow=(floor($row/3))*3;
124 $startColumn=(floor($column/3))*3;
125 $unknown=array();
126 for($pointer=0;$pointer<9;$pointer++)
127 {
128 $unknown[$pointer]=$pointer+1;
129 }
130 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
131 {
132 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
133 {
134 if($array[$rowPointer][$columnPointer]!=0)
135 {
136 $unknown[$array[$rowPointer][$columnPointer]-1]=0;
137 }
138 }
139 }
140 for($digit=0;$digit<9;$digit++)
141 {
142 if($unknown[$digit]!=0)
143 {
144 $number=$unknown[$digit];
145 $posibilities=0;
146 $rowPosition=-1;
147 $columnPosition=-1;
148 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
149 {
150 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
151 {
152 if($array[$rowPointer][$columnPointer]==0)
153 {
154 if($this->isPossibleInThatCellCheckByColumn($array,$number,$rowPointer,$columnPointer)&&$this->isPossibleInThatCellCheckByRow($array,$number,$rowPointer,$columnPointer))
155 {
156 $rowPosition=$rowPointer;
157 $columnPosition=$columnPointer;
158 $posibilities++;
159 }
160 }
161 }
162 }
163 if($posibilities==1)
164 {
165 $array[$rowPosition][$columnPosition]=$number;
166 return true;
167 }
168 }
169 }
170 return false;
171 }
172 private function reduceFromOneRow(&$array,$row)
173 {
174 $unknown=array();
175 for($column=0;$column<9;$column++)
176 {
177 $unknown[$column]=$column+1;
178 }
179 for($column=0;$column<9;$column++)
180 {
181 if($array[$row][$column]!=0)
182 {
183 $unknown[$array[$row][$column]-1]=0;
184 }
185 }
186 for($column=0;$column<9;$column++)
187 {
188 if($unknown[$column]!=0)
189 {
190 $number=$unknown[$column];
191 $posibilities=0;
192 $position=-1;
193 for($pointer=0;$pointer<9;$pointer++)
194 {
195 if($array[$row][$pointer]==0)
196 {
197 if($this->isPossibleInThatCellCheckByColumnAndZone($array,$number,$row,$pointer))
198 {
199 $position=$pointer;
200 $posibilities++;
201 }
202 }
203 }
204 if($posibilities==1)
205 {
206 $array[$row][$position]=$number;
207 return true;
208 }
209 }
210 }
211 return false;
212 }
213 private function reduceFromOneColumn(&$array,$column)
214 {
215 $unknown=array();
216 for($row=0;$row<9;$row++)
217 {
218 $unknown[$row]=$row+1;
219 }
220 for($row=0;$row<9;$row++)
221 {
222 if($array[$row][$column]!=0)
223 {
224 $unknown[$array[$row][$column]-1]=0;
225 }
226 }
227 for($row=0;$row<9;$row++)
228 {
229 if($unknown[$row]!=0)
230 {
231 $number=$unknown[$row];
232 $posibilities=0;
233 $position=-1;
234 for($pointer=0;$pointer<9;$pointer++)
235 {
236 if($array[$pointer][$column]==0)
237 {
238 if($this->isPossibleInThatCellCheckByRowAndZone($array,$number,$pointer,$column))
239 {
240 $position=$pointer;
241 $posibilities++;
242 }
243 }
244 }
245 if($posibilities==1)
246 {
247 $array[$position][$column]=$number;
248 return true;
249 }
250 }
251 }
252 return false;
253 }
254 private function isPossibleInThatCellCheckByRowAndZone($array,$number,$row,$column)
255 {
256 if(!$this->isPossibleInThatCellCheckByRow($array,$number,$row,$column))
257 {
258 return false;
259 }
260 else if(!$this->isPossibleInThatCellCheckByZone($array,$number,$row,$column))
261 {
262 return false;
263 }
264 else if(!$this->canBeInThatZoneCheckByColumn($array,$number,$row,$column))
265 {
266 return false;
267 }
268 else
269 {
270 return true;
271 }
272 }
273 private function isPossibleInThatCellCheckByColumnAndZone($array,$number,$row,$column)
274 {
275 if(!$this->isPossibleInThatCellCheckByColumn($array,$number,$row,$column))
276 {
277 return false;
278 }
279 else if(!$this->isPossibleInThatCellCheckByZone($array,$number,$row,$column))
280 {
281 return false;
282 }
283 else if(!$this->canBeInThatZoneCheckByRow($array,$number,$row,$column))
284 {
285 return false;
286 }
287 else
288 {
289 return true;
290 }
291 }
292 private function canBeInThatZoneCheckByRow($array,$number,$row,$column)
293 {
294 $startRow=(floor($row/3))*3;
295 $startColumn=(floor($column/3))*3;
296 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
297 {
298 if($rowPointer!=$row)
299 {
300 if(!$this->isPossibleInThatCellCheckByRow($array,$number,$rowPointer,$column))
301 {
302 continue;
303 }
304 $canItBe=true;
305 for($columnPointer=0;$columnPointer<9;$columnPointer++)
306 {
307 if($columnPointer<$startColumn||$columnPointer>$startColumn+2)
308 {
309 if($array[$rowPointer][$columnPointer]==0)
310 {
311 if($this->isPossibleInThatCellCheckByColumn($array,$number,$rowPointer,$columnPointer)&&$this->isPossibleInThatCellCheckByZone($array,$number,$rowPointer,$columnPointer))
312 {
313 $canItBe=false;
314 }
315 }
316 }
317 }
318 if($canItBe)
319 {
320 return false;
321 }
322 }
323 }
324 return true;
325 }
326 private function canBeInThatZoneCheckByColumn($array,$number,$row,$column)
327 {
328 $startRow=(floor($row/3))*3;
329 $startColumn=(floor($column/3))*3;
330 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
331 {
332 if($columnPointer!=$column)
333 {
334 if(!$this->isPossibleInThatCellCheckByColumn($array,$number,$row,$columnPointer))
335 {
336 continue;
337 }
338 $canItBe=true;
339 for($rowPointer=0;$rowPointer<9;$rowPointer++)
340 {
341 if($rowPointer<$startRow||$rowPointer>$startRow+2)
342 {
343 if($array[$rowPointer][$columnPointer]==0)
344 {
345 if($this->isPossibleInThatCellCheckByRow($array,$number,$rowPointer,$columnPointer)&&$this->isPossibleInThatCellCheckByZone($array,$number,$rowPointer,$columnPointer))
346 {
347 $canItBe=false;
348 }
349 }
350 }
351 }
352 if($canItBe)
353 {
354 return false;
355 }
356 }
357 }
358 return true;
359 }
360 private function isPossibleInThatCellCheckByZone($array,$number,$row,$column)
361 {
362 $startRow=(floor($row/3))*3;
363 $startColumn=(floor($column/3))*3;
364 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
365 {
366 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
367 {
368 if($array[$rowPointer][$columnPointer]==$number)
369 {
370 return false;
371 }
372 }
373 }
374 return true;
375 }
376 private function reduceFromThreeColumns(&$array,$firstColumn,$lastColumn)
377 {
378 $numberAndCount=array();
379 $numberAndPosition=array();
380 for($row=0;$row<9;$row++)
381 {
382 $numberAndCount[$row][0]=$row+1;
383 $numberAndCount[$row][1]=0;
384 }
385 for($row=0;$row<27;$row++)
386 {
387 for($column=0;$column<3;$column++)
388 {
389 $numberAndPosition[$row][$column]=0;
390 }
391 }
392 for($column=$firstColumn;$column<=$lastColumn;$column++)
393 {
394 for($row=0;$row<9;$row++)
395 {
396 if($array[$row][$column]!=0)
397 {
398 $numberAndCount[$array[$row][$column]-1][1]++;
399 $numberAndPosition[9*($column%3)+$row][0]=$array[$row][$column];
400 $numberAndPosition[9*($column%3)+$row][1]=$row;
401 $numberAndPosition[9*($column%3)+$row][2]=$column;
402 }
403 }
404 }
405 for($row=0;$row<9;$row++)
406 {
407 if($numberAndCount[$row][1]==2)
408 {
409 $number=$numberAndCount[$row][0];
410 $pointer=0;
411 $firstAppearanceRowPosition=-1;
412 $firstAppearanceColumnPosition=-1;
413 $secondAppearanceRowPosition=-1;
414 $secondAppearanceColumnPosition=-1;
415 while($pointer<27)
416 {
417 if($numberAndPosition[$pointer][0]==$number)
418 {
419 $firstAppearanceRowPosition=$numberAndPosition[$pointer][1];
420 $firstAppearanceColumnPosition=$numberAndPosition[$pointer][2];
421 $pointer++;
422 break;
423 }
424 else
425 {
426 $pointer++;
427 }
428 }
429 while($pointer<27)
430 {
431 if($numberAndPosition[$pointer][0]==$number)
432 {
433 $secondAppearanceRowPosition=$numberAndPosition[$pointer][1];
434 $secondAppearanceColumnPosition=$numberAndPosition[$pointer][2];
435 break;
436 }
437 else
438 {
439 $pointer++;
440 }
441 }
442 $thirdAppearanceColumnPosition=3*(floor($firstAppearanceColumnPosition/3))+3-$firstAppearanceColumnPosition%3-$secondAppearanceColumnPosition%3;
443 $thirdAppearanceRowStartPosition=(3-(floor($firstAppearanceRowPosition/3))-(floor($secondAppearanceRowPosition/3)))*3;
444 $posibilities=0;
445 $thirdAppearanceRowPosition=-1;
446 for($indicator=$thirdAppearanceRowStartPosition;$indicator<$thirdAppearanceRowStartPosition+3;$indicator++)
447 {
448 if($array[$indicator][$thirdAppearanceColumnPosition]==0)
449 {
450 if($this->isPossibleInThatCellCheckByRow($array,$number,$indicator,$thirdAppearanceColumnPosition))
451 {
452 $thirdAppearanceRowPosition=$indicator;
453 $posibilities++;
454 }
455 }
456 }
457 if($posibilities==1)
458 {
459 $array[$thirdAppearanceRowPosition][$thirdAppearanceColumnPosition]=$number;
460 return true;
461 }
462 }
463 }
464 return false;
465 }
466 private function reduceFromThreeRows(&$array,$firstRow,$lastRow)
467 {
468 $numberAndCount=array();
469 $numberAndPosition=array();
470 for($column=0;$column<9;$column++)
471 {
472 $numberAndCount[0][$column]=$column+1;
473 $numberAndCount[1][$column]=0;
474 }
475 for($row=0;$row<3;$row++)
476 {
477 for($column=0;$column<27;$column++)
478 {
479 $numberAndPosition[$row][$column]=0;
480 }
481 }
482 for($row=$firstRow;$row<=$lastRow;$row++)
483 {
484 for($column=0;$column<9;$column++)
485 {
486 if($array[$row][$column]!=0)
487 {
488 $numberAndCount[1][$array[$row][$column]-1]++;
489 $numberAndPosition[0][9*($row%3)+$column]=$array[$row][$column];
490 $numberAndPosition[1][9*($row%3)+$column]=$row;
491 $numberAndPosition[2][9*($row%3)+$column]=$column;
492 }
493 }
494 }
495 for($column=0;$column<9;$column++)
496 {
497 if($numberAndCount[1][$column]==2)
498 {
499 $number=$numberAndCount[0][$column];
500 $pointer=0;
501 $firstAppearanceRowPosition=-1;
502 $firstAppearanceColumnPosition=-1;
503 $secondAppearanceRowPosition=-1;
504 $secondAppearanceColumnPosition=-1;
505 while($pointer<27)
506 {
507 if($numberAndPosition[0][$pointer]==$number)
508 {
509 $firstAppearanceRowPosition=$numberAndPosition[1][$pointer];
510 $firstAppearanceColumnPosition=$numberAndPosition[2][$pointer];
511 $pointer++;
512 break;
513 }
514 else
515 {
516 $pointer++;
517 }
518 }
519 while($pointer<27)
520 {
521 if($numberAndPosition[0][$pointer]==$number)
522 {
523 $secondAppearanceRowPosition=$numberAndPosition[1][$pointer];
524 $secondAppearanceColumnPosition=$numberAndPosition[2][$pointer];
525 break;
526 }
527 else
528 {
529 $pointer++;
530 }
531 }
532 $thirdAppearanceRowPosition=3*(floor($firstAppearanceRowPosition/3))+3-$firstAppearanceRowPosition%3-$secondAppearanceRowPosition%3;
533 $thirdAppearanceColumnStartPosition=(3-(floor($firstAppearanceColumnPosition/3))-(floor($secondAppearanceColumnPosition/3)))*3;
534 $posibilities=0;
535 $thirdAppearanceColumnPosition=-1;
536 for($indicator=$thirdAppearanceColumnStartPosition;$indicator<$thirdAppearanceColumnStartPosition+3;$indicator++)
537 {
538 if($array[$thirdAppearanceRowPosition][$indicator]==0)
539 {
540 if($this->isPossibleInThatCellCheckByColumn($array,$number,$thirdAppearanceRowPosition,$indicator))
541 {
542 $thirdAppearanceColumnPosition=$indicator;
543 $posibilities++;
544 }
545 }
546 }
547 if($posibilities==1)
548 {
549 $array[$thirdAppearanceRowPosition][$thirdAppearanceColumnPosition]=$number;
550 return true;
551 }
552 }
553 }
554 return false;
555 }
556 private function isPossibleInThatCellCheckByColumn($array,$number,$row,$column)
557 {
558 for($pointer=0;$pointer<9;$pointer++)
559 {
560 if($pointer!=$row)
561 {
562 if($array[$pointer][$column]==$number)
563 {
564 return false;
565 }
566 }
567 }
568 return true;
569 }
570 private function isPossibleInThatCellCheckByRow($array,$number,$row,$column)
571 {
572 for($pointer=0;$pointer<9;$pointer++)
573 {
574 if($pointer!=$column)
575 {
576 if($array[$row][$pointer]==$number)
577 {
578 return false;
579 }
580 }
581 }
582 return true;
583 }
584 public function getArray()
585 {
586 return $this->array;
587 }
588}
589?>
2class Deducer
3{
4 private $array;
5 public function __construct($array)
6 {
7 $this->array=array();
8 for($row=0;$row<9;$row++)
9 {
10 for($column=0;$column<9;$column++)
11 {
12 $this->array[$row][$column]=$array[$row][$column];
13 }
14 }
15 }
16 private function isFinished()
17 {
18 for($row=0;$row<9;$row++)
19 {
20 for($column=0;$column<9;$column++)
21 {
22 if($this->array[$row][$column]==0)
23 {
24 return false;
25 }
26 }
27 }
28 return true;
29 }
30 public function deduceAll()
31 {
32 if($this->isFinished())
33 {
34 return;
35 }
36 for($row=0;$row<7;$row=$row+3)
37 {
38 for($column=0;$column<7;$column=$column+3)
39 {
40 if($this->reduceFromOneZone($this->array,$row,$column))
41 {
42 $this->deduceAll();
43 return;
44 }
45 }
46 }
47 for($row=0;$row<9;$row++)
48 {
49 if($this->reduceFromOneRow($this->array,$row))
50 {
51 $this->deduceAll();
52 return;
53 }
54 }
55 for($column=0;$column<9;$column++)
56 {
57 if($this->reduceFromOneColumn($this->array,$column))
58 {
59 $this->deduceAll();
60 return;
61 }
62 }
63 for($row=0;$row<7;$row=$row+3)
64 {
65 if($this->reduceFromThreeRows($this->array,$row,$row+2))
66 {
67 $this->deduceAll();
68 return;
69 }
70 }
71 for($column=0;$column<7;$column=$column+3)
72 {
73 if($this->reduceFromThreeColumns($this->array,$column,$column+2))
74 {
75 $this->deduceAll();
76 return;
77 }
78 }
79 }
80 public function deduceOnce()
81 {
82 for($row=0;$row<7;$row=$row+3)
83 {
84 for($column=0;$column<7;$column=$column+3)
85 {
86 if($this->reduceFromOneZone($this->array,$row,$column))
87 {
88 return;
89 }
90 }
91 }
92 for($row=0;$row<9;$row++)
93 {
94 if($this->reduceFromOneRow($this->array,$row))
95 {
96 return;
97 }
98 }
99 for($column=0;$column<9;$column++)
100 {
101 if($this->reduceFromOneColumn($this->array,$column))
102 {
103 return;
104 }
105 }
106 for($row=0;$row<7;$row=$row+3)
107 {
108 if($this->reduceFromThreeRows($this->array,$row,$row+2))
109 {
110 return;
111 }
112 }
113 for($column=0;$column<7;$column=$column+3)
114 {
115 if($this->reduceFromThreeColumns($this->array,$column,$column+2))
116 {
117 return;
118 }
119 }
120 }
121 private function reduceFromOneZone(&$array,$row,$column)
122 {
123 $startRow=(floor($row/3))*3;
124 $startColumn=(floor($column/3))*3;
125 $unknown=array();
126 for($pointer=0;$pointer<9;$pointer++)
127 {
128 $unknown[$pointer]=$pointer+1;
129 }
130 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
131 {
132 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
133 {
134 if($array[$rowPointer][$columnPointer]!=0)
135 {
136 $unknown[$array[$rowPointer][$columnPointer]-1]=0;
137 }
138 }
139 }
140 for($digit=0;$digit<9;$digit++)
141 {
142 if($unknown[$digit]!=0)
143 {
144 $number=$unknown[$digit];
145 $posibilities=0;
146 $rowPosition=-1;
147 $columnPosition=-1;
148 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
149 {
150 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
151 {
152 if($array[$rowPointer][$columnPointer]==0)
153 {
154 if($this->isPossibleInThatCellCheckByColumn($array,$number,$rowPointer,$columnPointer)&&$this->isPossibleInThatCellCheckByRow($array,$number,$rowPointer,$columnPointer))
155 {
156 $rowPosition=$rowPointer;
157 $columnPosition=$columnPointer;
158 $posibilities++;
159 }
160 }
161 }
162 }
163 if($posibilities==1)
164 {
165 $array[$rowPosition][$columnPosition]=$number;
166 return true;
167 }
168 }
169 }
170 return false;
171 }
172 private function reduceFromOneRow(&$array,$row)
173 {
174 $unknown=array();
175 for($column=0;$column<9;$column++)
176 {
177 $unknown[$column]=$column+1;
178 }
179 for($column=0;$column<9;$column++)
180 {
181 if($array[$row][$column]!=0)
182 {
183 $unknown[$array[$row][$column]-1]=0;
184 }
185 }
186 for($column=0;$column<9;$column++)
187 {
188 if($unknown[$column]!=0)
189 {
190 $number=$unknown[$column];
191 $posibilities=0;
192 $position=-1;
193 for($pointer=0;$pointer<9;$pointer++)
194 {
195 if($array[$row][$pointer]==0)
196 {
197 if($this->isPossibleInThatCellCheckByColumnAndZone($array,$number,$row,$pointer))
198 {
199 $position=$pointer;
200 $posibilities++;
201 }
202 }
203 }
204 if($posibilities==1)
205 {
206 $array[$row][$position]=$number;
207 return true;
208 }
209 }
210 }
211 return false;
212 }
213 private function reduceFromOneColumn(&$array,$column)
214 {
215 $unknown=array();
216 for($row=0;$row<9;$row++)
217 {
218 $unknown[$row]=$row+1;
219 }
220 for($row=0;$row<9;$row++)
221 {
222 if($array[$row][$column]!=0)
223 {
224 $unknown[$array[$row][$column]-1]=0;
225 }
226 }
227 for($row=0;$row<9;$row++)
228 {
229 if($unknown[$row]!=0)
230 {
231 $number=$unknown[$row];
232 $posibilities=0;
233 $position=-1;
234 for($pointer=0;$pointer<9;$pointer++)
235 {
236 if($array[$pointer][$column]==0)
237 {
238 if($this->isPossibleInThatCellCheckByRowAndZone($array,$number,$pointer,$column))
239 {
240 $position=$pointer;
241 $posibilities++;
242 }
243 }
244 }
245 if($posibilities==1)
246 {
247 $array[$position][$column]=$number;
248 return true;
249 }
250 }
251 }
252 return false;
253 }
254 private function isPossibleInThatCellCheckByRowAndZone($array,$number,$row,$column)
255 {
256 if(!$this->isPossibleInThatCellCheckByRow($array,$number,$row,$column))
257 {
258 return false;
259 }
260 else if(!$this->isPossibleInThatCellCheckByZone($array,$number,$row,$column))
261 {
262 return false;
263 }
264 else if(!$this->canBeInThatZoneCheckByColumn($array,$number,$row,$column))
265 {
266 return false;
267 }
268 else
269 {
270 return true;
271 }
272 }
273 private function isPossibleInThatCellCheckByColumnAndZone($array,$number,$row,$column)
274 {
275 if(!$this->isPossibleInThatCellCheckByColumn($array,$number,$row,$column))
276 {
277 return false;
278 }
279 else if(!$this->isPossibleInThatCellCheckByZone($array,$number,$row,$column))
280 {
281 return false;
282 }
283 else if(!$this->canBeInThatZoneCheckByRow($array,$number,$row,$column))
284 {
285 return false;
286 }
287 else
288 {
289 return true;
290 }
291 }
292 private function canBeInThatZoneCheckByRow($array,$number,$row,$column)
293 {
294 $startRow=(floor($row/3))*3;
295 $startColumn=(floor($column/3))*3;
296 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
297 {
298 if($rowPointer!=$row)
299 {
300 if(!$this->isPossibleInThatCellCheckByRow($array,$number,$rowPointer,$column))
301 {
302 continue;
303 }
304 $canItBe=true;
305 for($columnPointer=0;$columnPointer<9;$columnPointer++)
306 {
307 if($columnPointer<$startColumn||$columnPointer>$startColumn+2)
308 {
309 if($array[$rowPointer][$columnPointer]==0)
310 {
311 if($this->isPossibleInThatCellCheckByColumn($array,$number,$rowPointer,$columnPointer)&&$this->isPossibleInThatCellCheckByZone($array,$number,$rowPointer,$columnPointer))
312 {
313 $canItBe=false;
314 }
315 }
316 }
317 }
318 if($canItBe)
319 {
320 return false;
321 }
322 }
323 }
324 return true;
325 }
326 private function canBeInThatZoneCheckByColumn($array,$number,$row,$column)
327 {
328 $startRow=(floor($row/3))*3;
329 $startColumn=(floor($column/3))*3;
330 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
331 {
332 if($columnPointer!=$column)
333 {
334 if(!$this->isPossibleInThatCellCheckByColumn($array,$number,$row,$columnPointer))
335 {
336 continue;
337 }
338 $canItBe=true;
339 for($rowPointer=0;$rowPointer<9;$rowPointer++)
340 {
341 if($rowPointer<$startRow||$rowPointer>$startRow+2)
342 {
343 if($array[$rowPointer][$columnPointer]==0)
344 {
345 if($this->isPossibleInThatCellCheckByRow($array,$number,$rowPointer,$columnPointer)&&$this->isPossibleInThatCellCheckByZone($array,$number,$rowPointer,$columnPointer))
346 {
347 $canItBe=false;
348 }
349 }
350 }
351 }
352 if($canItBe)
353 {
354 return false;
355 }
356 }
357 }
358 return true;
359 }
360 private function isPossibleInThatCellCheckByZone($array,$number,$row,$column)
361 {
362 $startRow=(floor($row/3))*3;
363 $startColumn=(floor($column/3))*3;
364 for($rowPointer=$startRow;$rowPointer<$startRow+3;$rowPointer++)
365 {
366 for($columnPointer=$startColumn;$columnPointer<$startColumn+3;$columnPointer++)
367 {
368 if($array[$rowPointer][$columnPointer]==$number)
369 {
370 return false;
371 }
372 }
373 }
374 return true;
375 }
376 private function reduceFromThreeColumns(&$array,$firstColumn,$lastColumn)
377 {
378 $numberAndCount=array();
379 $numberAndPosition=array();
380 for($row=0;$row<9;$row++)
381 {
382 $numberAndCount[$row][0]=$row+1;
383 $numberAndCount[$row][1]=0;
384 }
385 for($row=0;$row<27;$row++)
386 {
387 for($column=0;$column<3;$column++)
388 {
389 $numberAndPosition[$row][$column]=0;
390 }
391 }
392 for($column=$firstColumn;$column<=$lastColumn;$column++)
393 {
394 for($row=0;$row<9;$row++)
395 {
396 if($array[$row][$column]!=0)
397 {
398 $numberAndCount[$array[$row][$column]-1][1]++;
399 $numberAndPosition[9*($column%3)+$row][0]=$array[$row][$column];
400 $numberAndPosition[9*($column%3)+$row][1]=$row;
401 $numberAndPosition[9*($column%3)+$row][2]=$column;
402 }
403 }
404 }
405 for($row=0;$row<9;$row++)
406 {
407 if($numberAndCount[$row][1]==2)
408 {
409 $number=$numberAndCount[$row][0];
410 $pointer=0;
411 $firstAppearanceRowPosition=-1;
412 $firstAppearanceColumnPosition=-1;
413 $secondAppearanceRowPosition=-1;
414 $secondAppearanceColumnPosition=-1;
415 while($pointer<27)
416 {
417 if($numberAndPosition[$pointer][0]==$number)
418 {
419 $firstAppearanceRowPosition=$numberAndPosition[$pointer][1];
420 $firstAppearanceColumnPosition=$numberAndPosition[$pointer][2];
421 $pointer++;
422 break;
423 }
424 else
425 {
426 $pointer++;
427 }
428 }
429 while($pointer<27)
430 {
431 if($numberAndPosition[$pointer][0]==$number)
432 {
433 $secondAppearanceRowPosition=$numberAndPosition[$pointer][1];
434 $secondAppearanceColumnPosition=$numberAndPosition[$pointer][2];
435 break;
436 }
437 else
438 {
439 $pointer++;
440 }
441 }
442 $thirdAppearanceColumnPosition=3*(floor($firstAppearanceColumnPosition/3))+3-$firstAppearanceColumnPosition%3-$secondAppearanceColumnPosition%3;
443 $thirdAppearanceRowStartPosition=(3-(floor($firstAppearanceRowPosition/3))-(floor($secondAppearanceRowPosition/3)))*3;
444 $posibilities=0;
445 $thirdAppearanceRowPosition=-1;
446 for($indicator=$thirdAppearanceRowStartPosition;$indicator<$thirdAppearanceRowStartPosition+3;$indicator++)
447 {
448 if($array[$indicator][$thirdAppearanceColumnPosition]==0)
449 {
450 if($this->isPossibleInThatCellCheckByRow($array,$number,$indicator,$thirdAppearanceColumnPosition))
451 {
452 $thirdAppearanceRowPosition=$indicator;
453 $posibilities++;
454 }
455 }
456 }
457 if($posibilities==1)
458 {
459 $array[$thirdAppearanceRowPosition][$thirdAppearanceColumnPosition]=$number;
460 return true;
461 }
462 }
463 }
464 return false;
465 }
466 private function reduceFromThreeRows(&$array,$firstRow,$lastRow)
467 {
468 $numberAndCount=array();
469 $numberAndPosition=array();
470 for($column=0;$column<9;$column++)
471 {
472 $numberAndCount[0][$column]=$column+1;
473 $numberAndCount[1][$column]=0;
474 }
475 for($row=0;$row<3;$row++)
476 {
477 for($column=0;$column<27;$column++)
478 {
479 $numberAndPosition[$row][$column]=0;
480 }
481 }
482 for($row=$firstRow;$row<=$lastRow;$row++)
483 {
484 for($column=0;$column<9;$column++)
485 {
486 if($array[$row][$column]!=0)
487 {
488 $numberAndCount[1][$array[$row][$column]-1]++;
489 $numberAndPosition[0][9*($row%3)+$column]=$array[$row][$column];
490 $numberAndPosition[1][9*($row%3)+$column]=$row;
491 $numberAndPosition[2][9*($row%3)+$column]=$column;
492 }
493 }
494 }
495 for($column=0;$column<9;$column++)
496 {
497 if($numberAndCount[1][$column]==2)
498 {
499 $number=$numberAndCount[0][$column];
500 $pointer=0;
501 $firstAppearanceRowPosition=-1;
502 $firstAppearanceColumnPosition=-1;
503 $secondAppearanceRowPosition=-1;
504 $secondAppearanceColumnPosition=-1;
505 while($pointer<27)
506 {
507 if($numberAndPosition[0][$pointer]==$number)
508 {
509 $firstAppearanceRowPosition=$numberAndPosition[1][$pointer];
510 $firstAppearanceColumnPosition=$numberAndPosition[2][$pointer];
511 $pointer++;
512 break;
513 }
514 else
515 {
516 $pointer++;
517 }
518 }
519 while($pointer<27)
520 {
521 if($numberAndPosition[0][$pointer]==$number)
522 {
523 $secondAppearanceRowPosition=$numberAndPosition[1][$pointer];
524 $secondAppearanceColumnPosition=$numberAndPosition[2][$pointer];
525 break;
526 }
527 else
528 {
529 $pointer++;
530 }
531 }
532 $thirdAppearanceRowPosition=3*(floor($firstAppearanceRowPosition/3))+3-$firstAppearanceRowPosition%3-$secondAppearanceRowPosition%3;
533 $thirdAppearanceColumnStartPosition=(3-(floor($firstAppearanceColumnPosition/3))-(floor($secondAppearanceColumnPosition/3)))*3;
534 $posibilities=0;
535 $thirdAppearanceColumnPosition=-1;
536 for($indicator=$thirdAppearanceColumnStartPosition;$indicator<$thirdAppearanceColumnStartPosition+3;$indicator++)
537 {
538 if($array[$thirdAppearanceRowPosition][$indicator]==0)
539 {
540 if($this->isPossibleInThatCellCheckByColumn($array,$number,$thirdAppearanceRowPosition,$indicator))
541 {
542 $thirdAppearanceColumnPosition=$indicator;
543 $posibilities++;
544 }
545 }
546 }
547 if($posibilities==1)
548 {
549 $array[$thirdAppearanceRowPosition][$thirdAppearanceColumnPosition]=$number;
550 return true;
551 }
552 }
553 }
554 return false;
555 }
556 private function isPossibleInThatCellCheckByColumn($array,$number,$row,$column)
557 {
558 for($pointer=0;$pointer<9;$pointer++)
559 {
560 if($pointer!=$row)
561 {
562 if($array[$pointer][$column]==$number)
563 {
564 return false;
565 }
566 }
567 }
568 return true;
569 }
570 private function isPossibleInThatCellCheckByRow($array,$number,$row,$column)
571 {
572 for($pointer=0;$pointer<9;$pointer++)
573 {
574 if($pointer!=$column)
575 {
576 if($array[$row][$pointer]==$number)
577 {
578 return false;
579 }
580 }
581 }
582 return true;
583 }
584 public function getArray()
585 {
586 return $this->array;
587 }
588}
589?>
puzzle.php:
1<?php
2 include('Deducer.php');
3 if(isset($_POST["type"]))
4 {
5 try
6 {
7 $array=$_POST["array"];
8 $numbers=split(",",$array);
9 $dealingArray=array();
10 for($row=0;$row<9;$row++)
11 {
12 for($column=0;$column<9;$column++)
13 {
14 $dealingArray[$row][$column]=(int)$numbers[$row*9+$column];
15 }
16 }
17 $deducer=new Deducer($dealingArray);
18 if($_POST["type"]=="OneStep")
19 {
20 $deducer->deduceOnce();
21 }
22 else if($_POST["type"]=="AllSteps")
23 {
24 $deducer->deduceAll();
25 }
26 $resultArray=$deducer->getArray();
27 $sb="";
28 for($row=0;$row<9;$row++)
29 {
30 for($column=0;$column<9;$column++)
31 {
32 if($sb=="")
33 {
34 $sb=$sb.$resultArray[$row][$column];
35 }
36 else
37 {
38 $sb=$sb.",".$resultArray[$row][$column];
39 }
40 }
41 }
42 echo $sb;
43 }
44 catch (Exception $e)
45 {
46 echo "ri";
47 }
48 return;
49 }
50?>
51<html>
52<body>
53<script>
54var request=false;
55try
56{
57 request = new XMLHttpRequest();//Firefox
58}
59catch(trymicrosoft)
60{
61 try
62 {
63 request = new ActiveXObject("Msxml2.XMLHTTP.5.0");//New IE
64 }
65 catch(othermicrosoft)
66 {
67 try
68 {
69 request = new ActiveXObject("Microsoft.XMLHTTP");//Old IE
70 }
71 catch(failed)
72 {
73 request = false;//Unknown browser
74 }
75 }
76}
77if(!request)
78{
79 alert("Please use Internet Explorer");
80}
81function dealNullInput(input)
82{
83 if(input=="")
84 {
85 return "0";
86 }
87 else
88 {
89 return input;
90 }
91}
92function dealZeroOutput(input)
93{
94 if(input==0)
95 {
96 return "";
97 }
98 else
99 {
100 return input;
101 }
102}
103function sendOneStepRequest()
104{
105 url=escape("puzzle.php")+"?random=" + Math.random();//use a random number to avoid cache
106 request.open("POST",url,true);//connection method
107 request.onreadystatechange=showProcess;//show Process method
108 request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
109 var array="";
110 for(var i=0;i<81;i++)
111 {
112 if(array=="")
113 {
114 array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);
115 }
116 else
117 {
118 array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value);
119 }
120 }
121 request.send("type=OneStep"+"&array="+escape(array));
122}
123function sendAllStepsRequest()
124{
125 url=escape("puzzle.php")+"?random=" + Math.random();
126 request.open("POST",url,true);//connection method
127 request.onreadystatechange=showProcess;//show Process method
128 request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
129 var array="";
130 for(var i=0;i<81;i++)
131 {
132 if(array=="")
133 {
134 array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);
135 }
136 else
137 {
138 array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value.replace(/ /g, ""));
139 }
140 }
141 request.send("type=AllSteps"+"&array="+escape(array));
142}
143function showProcess()
144{
145 if(request.readyState == 4)//finished
146 {
147 if(request.status == 200)//normal
148 {
149 var splitResult=request.responseText.split(",");
150 for(var i=0;i<81;i++)
151 {
152 document.getElementsByName("TextBox")[i].value=dealZeroOutput(splitResult[i]);
153 }
154 }
155 }
156 else if(request.readyState == 1)
157 {
158 //"finished step1";
159 }
160 else if(request.readyState == 2)
161 {
162 //"finished step2";
163 }
164 else if(request.readyState == 3)
165 {
166 //"finished step3";
167 }
168}
169</script>
170<table>
171<tr>
172<td>
173<input name="TextBox" type="text" style="width: 25px"/>
174</td>
175<td>
176<input name="TextBox" type="text" style="width: 25px"/>
177</td>
178<td>
179<input name="TextBox" type="text" style="width: 25px"/>
180</td>
181<td>
182<input name="TextBox" type="text" style="width: 25px"/>
183</td>
184<td>
185<input name="TextBox" type="text" style="width: 25px"/>
186</td>
187<td>
188<input name="TextBox" type="text" style="width: 25px"/>
189</td>
190<td>
191<input name="TextBox" type="text" style="width: 25px"/>
192</td>
193<td>
194<input name="TextBox" type="text" style="width: 25px"/>
195</td>
196<td>
197<input name="TextBox" type="text" style="width: 25px"/>
198</td>
199</tr>
200<tr>
201<td>
202<input name="TextBox" type="text" style="width: 25px"/>
203</td>
204<td>
205<input name="TextBox" type="text" style="width: 25px"/>
206</td>
207<td>
208<input name="TextBox" type="text" style="width: 25px"/>
209</td>
210<td>
211<input name="TextBox" type="text" style="width: 25px"/>
212</td>
213<td>
214<input name="TextBox" type="text" style="width: 25px"/>
215</td>
216<td>
217<input name="TextBox" type="text" style="width: 25px"/>
218</td>
219<td>
220<input name="TextBox" type="text" style="width: 25px"/>
221</td>
222<td>
223<input name="TextBox" type="text" style="width: 25px"/>
224</td>
225<td>
226<input name="TextBox" type="text" style="width: 25px"/>
227</td>
228</tr>
229<tr>
230<td>
231<input name="TextBox" type="text" style="width: 25px"/>
232</td>
233<td>
234<input name="TextBox" type="text" style="width: 25px"/>
235</td>
236<td>
237<input name="TextBox" type="text" style="width: 25px"/>
238</td>
239<td>
240<input name="TextBox" type="text" style="width: 25px"/>
241</td>
242<td>
243<input name="TextBox" type="text" style="width: 25px"/>
244</td>
245<td>
246<input name="TextBox" type="text" style="width: 25px"/>
247</td>
248<td>
249<input name="TextBox" type="text" style="width: 25px"/>
250</td>
251<td>
252<input name="TextBox" type="text" style="width: 25px"/>
253</td>
254<td>
255<input name="TextBox" type="text" style="width: 25px"/>
256</td>
257</tr>
258<tr>
259<td>
260<input name="TextBox" type="text" style="width: 25px"/>
261</td>
262<td>
263<input name="TextBox" type="text" style="width: 25px"/>
264</td>
265<td>
266<input name="TextBox" type="text" style="width: 25px"/>
267</td>
268<td>
269<input name="TextBox" type="text" style="width: 25px"/>
270</td>
271<td>
272<input name="TextBox" type="text" style="width: 25px"/>
273</td>
274<td>
275<input name="TextBox" type="text" style="width: 25px"/>
276</td>
277<td>
278<input name="TextBox" type="text" style="width: 25px"/>
279</td>
280<td>
281<input name="TextBox" type="text" style="width: 25px"/>
282</td>
283<td>
284<input name="TextBox" type="text" style="width: 25px"/>
285</td>
286</tr>
287<tr>
288<td>
289<input name="TextBox" type="text" style="width: 25px"/>
290</td>
291<td>
292<input name="TextBox" type="text" style="width: 25px"/>
293</td>
294<td>
295<input name="TextBox" type="text" style="width: 25px"/>
296</td>
297<td>
298<input name="TextBox" type="text" style="width: 25px"/>
299</td>
300<td>
301<input name="TextBox" type="text" style="width: 25px"/>
302</td>
303<td>
304<input name="TextBox" type="text" style="width: 25px"/>
305</td>
306<td>
307<input name="TextBox" type="text" style="width: 25px"/>
308</td>
309<td>
310<input name="TextBox" type="text" style="width: 25px"/>
311</td>
312<td>
313<input name="TextBox" type="text" style="width: 25px"/>
314</td>
315</tr>
316<tr>
317<td>
318<input name="TextBox" type="text" style="width: 25px"/>
319</td>
320<td>
321<input name="TextBox" type="text" style="width: 25px"/>
322</td>
323<td>
324<input name="TextBox" type="text" style="width: 25px"/>
325</td>
326<td>
327<input name="TextBox" type="text" style="width: 25px"/>
328</td>
329<td>
330<input name="TextBox" type="text" style="width: 25px"/>
331</td>
332<td>
333<input name="TextBox" type="text" style="width: 25px"/>
334</td>
335<td>
336<input name="TextBox" type="text" style="width: 25px"/>
337</td>
338<td>
339<input name="TextBox" type="text" style="width: 25px"/>
340</td>
341<td>
342<input name="TextBox" type="text" style="width: 25px"/>
343</td>
344</tr>
345<tr>
346<td>
347<input name="TextBox" type="text" style="width: 25px"/>
348</td>
349<td>
350<input name="TextBox" type="text" style="width: 25px"/>
351</td>
352<td>
353<input name="TextBox" type="text" style="width: 25px"/>
354</td>
355<td>
356<input name="TextBox" type="text" style="width: 25px"/>
357</td>
358<td>
359<input name="TextBox" type="text" style="width: 25px"/>
360</td>
361<td>
362<input name="TextBox" type="text" style="width: 25px"/>
363</td>
364<td>
365<input name="TextBox" type="text" style="width: 25px"/>
366</td>
367<td>
368<input name="TextBox" type="text" style="width: 25px"/>
369</td>
370<td>
371<input name="TextBox" type="text" style="width: 25px"/>
372</td>
373</tr>
374<tr>
375<td>
376<input name="TextBox" type="text" style="width: 25px"/>
377</td>
378<td>
379<input name="TextBox" type="text" style="width: 25px"/>
380</td>
381<td>
382<input name="TextBox" type="text" style="width: 25px"/>
383</td>
384<td>
385<input name="TextBox" type="text" style="width: 25px"/>
386</td>
387<td>
388<input name="TextBox" type="text" style="width: 25px"/>
389</td>
390<td>
391<input name="TextBox" type="text" style="width: 25px"/>
392</td>
393<td>
394<input name="TextBox" type="text" style="width: 25px"/>
395</td>
396<td>
397<input name="TextBox" type="text" style="width: 25px"/>
398</td>
399<td>
400<input name="TextBox" type="text" style="width: 25px"/>
401</td>
402</tr>
403<tr>
404<td>
405<input name="TextBox" type="text" style="width: 25px"/>
406</td>
407<td>
408<input name="TextBox" type="text" style="width: 25px"/>
409</td>
410<td>
411<input name="TextBox" type="text" style="width: 25px"/>
412</td>
413<td>
414<input name="TextBox" type="text" style="width: 25px"/>
415</td>
416<td>
417<input name="TextBox" type="text" style="width: 25px"/>
418</td>
419<td>
420<input name="TextBox" type="text" style="width: 25px"/>
421</td>
422<td>
423<input name="TextBox" type="text" style="width: 25px"/>
424</td>
425<td>
426<input name="TextBox" type="text" style="width: 25px"/>
427</td>
428<td>
429<input name="TextBox" type="text" style="width: 25px"/>
430</td>
431</tr>
432</table>
433<input type="button" name="OneStep" value="OneStep" id="OneStep" onclick="sendOneStepRequest()" />
434<input type="button" name="AllSteps" value="AllSteps" id="AllSteps" onclick="sendAllStepsRequest()" />
435</body>
436</html>
2 include('Deducer.php');
3 if(isset($_POST["type"]))
4 {
5 try
6 {
7 $array=$_POST["array"];
8 $numbers=split(",",$array);
9 $dealingArray=array();
10 for($row=0;$row<9;$row++)
11 {
12 for($column=0;$column<9;$column++)
13 {
14 $dealingArray[$row][$column]=(int)$numbers[$row*9+$column];
15 }
16 }
17 $deducer=new Deducer($dealingArray);
18 if($_POST["type"]=="OneStep")
19 {
20 $deducer->deduceOnce();
21 }
22 else if($_POST["type"]=="AllSteps")
23 {
24 $deducer->deduceAll();
25 }
26 $resultArray=$deducer->getArray();
27 $sb="";
28 for($row=0;$row<9;$row++)
29 {
30 for($column=0;$column<9;$column++)
31 {
32 if($sb=="")
33 {
34 $sb=$sb.$resultArray[$row][$column];
35 }
36 else
37 {
38 $sb=$sb.",".$resultArray[$row][$column];
39 }
40 }
41 }
42 echo $sb;
43 }
44 catch (Exception $e)
45 {
46 echo "ri";
47 }
48 return;
49 }
50?>
51<html>
52<body>
53<script>
54var request=false;
55try
56{
57 request = new XMLHttpRequest();//Firefox
58}
59catch(trymicrosoft)
60{
61 try
62 {
63 request = new ActiveXObject("Msxml2.XMLHTTP.5.0");//New IE
64 }
65 catch(othermicrosoft)
66 {
67 try
68 {
69 request = new ActiveXObject("Microsoft.XMLHTTP");//Old IE
70 }
71 catch(failed)
72 {
73 request = false;//Unknown browser
74 }
75 }
76}
77if(!request)
78{
79 alert("Please use Internet Explorer");
80}
81function dealNullInput(input)
82{
83 if(input=="")
84 {
85 return "0";
86 }
87 else
88 {
89 return input;
90 }
91}
92function dealZeroOutput(input)
93{
94 if(input==0)
95 {
96 return "";
97 }
98 else
99 {
100 return input;
101 }
102}
103function sendOneStepRequest()
104{
105 url=escape("puzzle.php")+"?random=" + Math.random();//use a random number to avoid cache
106 request.open("POST",url,true);//connection method
107 request.onreadystatechange=showProcess;//show Process method
108 request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
109 var array="";
110 for(var i=0;i<81;i++)
111 {
112 if(array=="")
113 {
114 array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);
115 }
116 else
117 {
118 array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value);
119 }
120 }
121 request.send("type=OneStep"+"&array="+escape(array));
122}
123function sendAllStepsRequest()
124{
125 url=escape("puzzle.php")+"?random=" + Math.random();
126 request.open("POST",url,true);//connection method
127 request.onreadystatechange=showProcess;//show Process method
128 request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
129 var array="";
130 for(var i=0;i<81;i++)
131 {
132 if(array=="")
133 {
134 array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);
135 }
136 else
137 {
138 array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value.replace(/ /g, ""));
139 }
140 }
141 request.send("type=AllSteps"+"&array="+escape(array));
142}
143function showProcess()
144{
145 if(request.readyState == 4)//finished
146 {
147 if(request.status == 200)//normal
148 {
149 var splitResult=request.responseText.split(",");
150 for(var i=0;i<81;i++)
151 {
152 document.getElementsByName("TextBox")[i].value=dealZeroOutput(splitResult[i]);
153 }
154 }
155 }
156 else if(request.readyState == 1)
157 {
158 //"finished step1";
159 }
160 else if(request.readyState == 2)
161 {
162 //"finished step2";
163 }
164 else if(request.readyState == 3)
165 {
166 //"finished step3";
167 }
168}
169</script>
170<table>
171<tr>
172<td>
173<input name="TextBox" type="text" style="width: 25px"/>
174</td>
175<td>
176<input name="TextBox" type="text" style="width: 25px"/>
177</td>
178<td>
179<input name="TextBox" type="text" style="width: 25px"/>
180</td>
181<td>
182<input name="TextBox" type="text" style="width: 25px"/>
183</td>
184<td>
185<input name="TextBox" type="text" style="width: 25px"/>
186</td>
187<td>
188<input name="TextBox" type="text" style="width: 25px"/>
189</td>
190<td>
191<input name="TextBox" type="text" style="width: 25px"/>
192</td>
193<td>
194<input name="TextBox" type="text" style="width: 25px"/>
195</td>
196<td>
197<input name="TextBox" type="text" style="width: 25px"/>
198</td>
199</tr>
200<tr>
201<td>
202<input name="TextBox" type="text" style="width: 25px"/>
203</td>
204<td>
205<input name="TextBox" type="text" style="width: 25px"/>
206</td>
207<td>
208<input name="TextBox" type="text" style="width: 25px"/>
209</td>
210<td>
211<input name="TextBox" type="text" style="width: 25px"/>
212</td>
213<td>
214<input name="TextBox" type="text" style="width: 25px"/>
215</td>
216<td>
217<input name="TextBox" type="text" style="width: 25px"/>
218</td>
219<td>
220<input name="TextBox" type="text" style="width: 25px"/>
221</td>
222<td>
223<input name="TextBox" type="text" style="width: 25px"/>
224</td>
225<td>
226<input name="TextBox" type="text" style="width: 25px"/>
227</td>
228</tr>
229<tr>
230<td>
231<input name="TextBox" type="text" style="width: 25px"/>
232</td>
233<td>
234<input name="TextBox" type="text" style="width: 25px"/>
235</td>
236<td>
237<input name="TextBox" type="text" style="width: 25px"/>
238</td>
239<td>
240<input name="TextBox" type="text" style="width: 25px"/>
241</td>
242<td>
243<input name="TextBox" type="text" style="width: 25px"/>
244</td>
245<td>
246<input name="TextBox" type="text" style="width: 25px"/>
247</td>
248<td>
249<input name="TextBox" type="text" style="width: 25px"/>
250</td>
251<td>
252<input name="TextBox" type="text" style="width: 25px"/>
253</td>
254<td>
255<input name="TextBox" type="text" style="width: 25px"/>
256</td>
257</tr>
258<tr>
259<td>
260<input name="TextBox" type="text" style="width: 25px"/>
261</td>
262<td>
263<input name="TextBox" type="text" style="width: 25px"/>
264</td>
265<td>
266<input name="TextBox" type="text" style="width: 25px"/>
267</td>
268<td>
269<input name="TextBox" type="text" style="width: 25px"/>
270</td>
271<td>
272<input name="TextBox" type="text" style="width: 25px"/>
273</td>
274<td>
275<input name="TextBox" type="text" style="width: 25px"/>
276</td>
277<td>
278<input name="TextBox" type="text" style="width: 25px"/>
279</td>
280<td>
281<input name="TextBox" type="text" style="width: 25px"/>
282</td>
283<td>
284<input name="TextBox" type="text" style="width: 25px"/>
285</td>
286</tr>
287<tr>
288<td>
289<input name="TextBox" type="text" style="width: 25px"/>
290</td>
291<td>
292<input name="TextBox" type="text" style="width: 25px"/>
293</td>
294<td>
295<input name="TextBox" type="text" style="width: 25px"/>
296</td>
297<td>
298<input name="TextBox" type="text" style="width: 25px"/>
299</td>
300<td>
301<input name="TextBox" type="text" style="width: 25px"/>
302</td>
303<td>
304<input name="TextBox" type="text" style="width: 25px"/>
305</td>
306<td>
307<input name="TextBox" type="text" style="width: 25px"/>
308</td>
309<td>
310<input name="TextBox" type="text" style="width: 25px"/>
311</td>
312<td>
313<input name="TextBox" type="text" style="width: 25px"/>
314</td>
315</tr>
316<tr>
317<td>
318<input name="TextBox" type="text" style="width: 25px"/>
319</td>
320<td>
321<input name="TextBox" type="text" style="width: 25px"/>
322</td>
323<td>
324<input name="TextBox" type="text" style="width: 25px"/>
325</td>
326<td>
327<input name="TextBox" type="text" style="width: 25px"/>
328</td>
329<td>
330<input name="TextBox" type="text" style="width: 25px"/>
331</td>
332<td>
333<input name="TextBox" type="text" style="width: 25px"/>
334</td>
335<td>
336<input name="TextBox" type="text" style="width: 25px"/>
337</td>
338<td>
339<input name="TextBox" type="text" style="width: 25px"/>
340</td>
341<td>
342<input name="TextBox" type="text" style="width: 25px"/>
343</td>
344</tr>
345<tr>
346<td>
347<input name="TextBox" type="text" style="width: 25px"/>
348</td>
349<td>
350<input name="TextBox" type="text" style="width: 25px"/>
351</td>
352<td>
353<input name="TextBox" type="text" style="width: 25px"/>
354</td>
355<td>
356<input name="TextBox" type="text" style="width: 25px"/>
357</td>
358<td>
359<input name="TextBox" type="text" style="width: 25px"/>
360</td>
361<td>
362<input name="TextBox" type="text" style="width: 25px"/>
363</td>
364<td>
365<input name="TextBox" type="text" style="width: 25px"/>
366</td>
367<td>
368<input name="TextBox" type="text" style="width: 25px"/>
369</td>
370<td>
371<input name="TextBox" type="text" style="width: 25px"/>
372</td>
373</tr>
374<tr>
375<td>
376<input name="TextBox" type="text" style="width: 25px"/>
377</td>
378<td>
379<input name="TextBox" type="text" style="width: 25px"/>
380</td>
381<td>
382<input name="TextBox" type="text" style="width: 25px"/>
383</td>
384<td>
385<input name="TextBox" type="text" style="width: 25px"/>
386</td>
387<td>
388<input name="TextBox" type="text" style="width: 25px"/>
389</td>
390<td>
391<input name="TextBox" type="text" style="width: 25px"/>
392</td>
393<td>
394<input name="TextBox" type="text" style="width: 25px"/>
395</td>
396<td>
397<input name="TextBox" type="text" style="width: 25px"/>
398</td>
399<td>
400<input name="TextBox" type="text" style="width: 25px"/>
401</td>
402</tr>
403<tr>
404<td>
405<input name="TextBox" type="text" style="width: 25px"/>
406</td>
407<td>
408<input name="TextBox" type="text" style="width: 25px"/>
409</td>
410<td>
411<input name="TextBox" type="text" style="width: 25px"/>
412</td>
413<td>
414<input name="TextBox" type="text" style="width: 25px"/>
415</td>
416<td>
417<input name="TextBox" type="text" style="width: 25px"/>
418</td>
419<td>
420<input name="TextBox" type="text" style="width: 25px"/>
421</td>
422<td>
423<input name="TextBox" type="text" style="width: 25px"/>
424</td>
425<td>
426<input name="TextBox" type="text" style="width: 25px"/>
427</td>
428<td>
429<input name="TextBox" type="text" style="width: 25px"/>
430</td>
431</tr>
432</table>
433<input type="button" name="OneStep" value="OneStep" id="OneStep" onclick="sendOneStepRequest()" />
434<input type="button" name="AllSteps" value="AllSteps" id="AllSteps" onclick="sendAllStepsRequest()" />
435</body>
436</html>