Advertisement
nuit

Sudoku.class

Mar 20th, 2011
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.06 KB | None | 0 0
  1. $sud = new Sudoku($argv[1]);
  2. $sud->solve();
  3. $sud->printSudoku();
  4.  
  5. class Sudoku {
  6.     public $charset = array(1,2,3,4,5,6,7,8,9); # = range(0,9);
  7.     public $sudoku = array(
  8.         'x' => 9,
  9.         'y' => 9,
  10.         'boxX' => 3,
  11.         'boxY' => 3
  12.     );
  13.     private $sud;
  14.     private $holes = array();
  15.     public  $emptyHole = '.';
  16.  
  17.     function __construct($sud) {
  18.         $this->sud = $sud;
  19.        
  20.         for($i = 0; $i < strlen($sud); $i++)
  21.             if($sud{$i} == $this->emptyHole) $this->holes[] = $i;
  22.     }
  23.  
  24.     private function _getHoles() {
  25.         $this->holes = array();
  26.         for($i = 0; $i < strlen($this->sud); $i++)
  27.             if($this->sud{$i} == $this->emptyHole) $this->holes[] = $i;
  28.     }
  29.  
  30.     public function solve($layer=0) {
  31.         $possibleChars = $this->_getChars($this->holes[$layer]+1);
  32.  
  33.         foreach($possibleChars as $char) {
  34.             $this->sud{$this->holes[$layer]} = $char;
  35.             if($layer != count($this->holes)-1) {
  36.                 if($this->solve($layer+1)) return $this->sud;
  37.             } else return $this->sud;
  38.         }
  39.  
  40.         $this->sud{$this->holes[$layer]} = $this->emptyHole;
  41.         return false;
  42.     }
  43.    
  44.     private function _getChars($position) {
  45.         return array_intersect($this->_checkBox(ceil((ceil($position/$this->sudoku['x']))/$this->sudoku['boxX']),ceil(($this->_checkColumn($position-(ceil($position/$this->sudoku['x']))*$this->sudoku['x']+$this->sudoku['x'])/$this->sudoku['boxY'])),$this->_checkRow(ceil($position/$this->sudoku['x'])),$this->_checkColumn($position-(ceil($position/$this->sudoku['x']))*$this->sudoku['x']+$this->sudoku['x']));
  46.     }
  47.    
  48.     private function _checkRow($row) {
  49.         $vorkommen = array();
  50.         for($i = $row*$this->sudoku['x']-$this->sudoku['x']; $i < $row*$this->sudoku['x']; $i++)
  51.             if($this->sud{$i} != '.')
  52.                 $vorkommen[] = $this->sud{$i};
  53.  
  54.         return array_diff($this->charset,$vorkommen);
  55.     }
  56.  
  57.     private function _checkColumn($column) {
  58.         $vorkommen = array();
  59.         for($i = $column-1; $i < $this->sudoku['x']*$this->sudoku['y']; $i += $this->sudoku['x'])
  60.             if($this->sud{$i} != '.')
  61.                 $vorkommen[] = $this->sud{$i};
  62.  
  63.         return array_diff($this->charset,$vorkommen);
  64.     }
  65.  
  66.     private function _checkBox($boxrow,$boxcolumn) {
  67.         $vorkommen = array();
  68.         $startbox = ($boxrow*$this->sudoku['boxY']*$this->sudoku['x'])-$this->sudoku['boxY']*$this->sudoku['x']+$this->sudoku['boxY']*$boxcolumn-$this->sudoku['boxY'];
  69.        
  70.         for($a = 0; $a < $this->sudoku['boxY']; $a++) {
  71.             for($i = 0; $i < $this->sudoku['boxX']; $i++) {
  72.                 if($this->sud{$i+$startbox} != '.')
  73.                     $vorkommen[] = $this->sud{$i+$startbox};
  74.                 if($startbox+$this->sudoku['boxX'] === $startbox+$i+1)
  75.                     $startbox += $this->sudoku['x'];
  76.             }
  77.         }
  78.        
  79.         return array_diff($this->charset,$vorkommen);
  80.     }
  81.    
  82.     public function printSudoku($inline=false) {
  83.         if($inline) {
  84.             print implode('',$this->sud);
  85.         } else {
  86.             print "\n";
  87.             $a = 0;
  88.             for($i = 0; $i < strlen($this->sud); $i++) {
  89.                 print str_replace('.',$this->emptyHole,$this->sud{$i})." ";
  90.                 if(($i+1) % $this->sudoku['boxX'] === 0) print "  ";
  91.    
  92.                 if(($i+1) % $this->sudoku['x'] === 0) {
  93.                     print "\n";
  94.                     if(($a+1) % $this->sudoku['boxY'] === 0) print "\n";
  95.    
  96.                     $a++;
  97.                 }
  98.             }
  99.         }
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement