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

puzzle.php:
  1sudoku breaker-php edition<?php 
  2sudoku breaker-php edition    include('Deducer.php');
  3sudoku breaker-php edition    if(isset($_POST["type"]))
  4sudoku breaker-php edition    {
  5sudoku breaker-php edition        try
  6sudoku breaker-php edition        {
  7sudoku breaker-php edition            $array=$_POST["array"];
  8sudoku breaker-php edition            $numbers=split(",",$array);
  9sudoku breaker-php edition            $dealingArray=array();
 10sudoku breaker-php edition            for($row=0;$row<9;$row++)
 11sudoku breaker-php edition            {
 12sudoku breaker-php edition                for($column=0;$column<9;$column++)
 13sudoku breaker-php edition                {    
 14sudoku breaker-php edition                    $dealingArray[$row][$column]=(int)$numbers[$row*9+$column];
 15sudoku breaker-php edition                }
 16sudoku breaker-php edition            }
 17sudoku breaker-php edition            $deducer=new Deducer($dealingArray);
 18sudoku breaker-php edition            if($_POST["type"]=="OneStep")
 19sudoku breaker-php edition            {
 20sudoku breaker-php edition                $deducer->deduceOnce();
 21sudoku breaker-php edition            }
 22sudoku breaker-php edition            else if($_POST["type"]=="AllSteps")
 23sudoku breaker-php edition            {
 24sudoku breaker-php edition                $deducer->deduceAll();
 25sudoku breaker-php edition            }
 26sudoku breaker-php edition            $resultArray=$deducer->getArray();
 27sudoku breaker-php edition            $sb="";
 28sudoku breaker-php edition            for($row=0;$row<9;$row++)
 29sudoku breaker-php edition            {
 30sudoku breaker-php edition                for($column=0;$column<9;$column++)
 31sudoku breaker-php edition                {
 32sudoku breaker-php edition                    if($sb=="")
 33sudoku breaker-php edition                    {
 34sudoku breaker-php edition                        $sb=$sb.$resultArray[$row][$column];
 35sudoku breaker-php edition                    }
 36sudoku breaker-php edition                    else
 37sudoku breaker-php edition                    {
 38sudoku breaker-php edition                        $sb=$sb.",".$resultArray[$row][$column];
 39sudoku breaker-php edition                    }
 40sudoku breaker-php edition                }
 41sudoku breaker-php edition            }
 42sudoku breaker-php edition            echo $sb;
 43sudoku breaker-php edition        }
 44sudoku breaker-php edition        catch (Exception $e) 
 45sudoku breaker-php edition        {
 46sudoku breaker-php edition            echo "ri";
 47sudoku breaker-php edition        }
 48sudoku breaker-php edition        return;
 49sudoku breaker-php edition    }
 50sudoku breaker-php edition?>
 51sudoku breaker-php edition<html>
 52sudoku breaker-php edition<body>
 53>

相关文章:

  • 2022-02-27
  • 2022-12-23
  • 2021-10-28
  • 2021-09-04
  • 2021-12-30
  • 2021-04-09
  • 2021-10-30
  • 2021-05-28
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-18
  • 2022-12-23
  • 2021-07-07
  • 2021-12-25
相关资源
相似解决方案