数独 回溯算法 发表于 2017-08-07 数独 回溯算法,计算未填写的 九宫格123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129class bord { private $bord; public function __construct(array $bord) { $this->bord = $bord; } public function run() { $pos = $this->next(); // var_dump($pos); if ($pos == false) { return true; }; list($x, $y) = $pos;// echo $this->string($x,$y);// echo '<br/>'; for ($v = 1; $v < 10; $v++) { // var_dump($x, $y, $v); // var_dump($this->check($x, $y, $v)); //echo $this->__toString(); if ($this->check($x, $y, $v)) { $this->set($x, $y, $v); if($this->run()){ return true; }; } } $this->release($x, $y); // $this->run(); return false; } public function next() { foreach ($this->bord as $x => $array) { foreach ($array as $y => $v) { if ($v == 0) { return [$x, $y]; } } } return false; } public function check($x, $y, $v) { foreach ($this->bord as $x_a) { if ($x_a[$y] == $v) { return false; } } foreach ($this->bord[$x] as $y_v) { // var_dump($y_v); if ($y_v == $v) { return false; } } $x_b = intval(floor(($x-1)/3)*3 +1); $y_b = intval(floor(($y-1)/3)*3 +1); // var_dump('x',$x_b);var_dump('y',$y_b); for ($x = $x_b; $x < $x_b + 3; $x++) { for ($y = $y_b; $y < $y_b + 3; $y++) { if($this->bord[$x][$y] ==$v){ return false; } } } return true; } public function set($x, $y, $v) { $this->bord[$x][$y] = $v; } public function complete() { return $this->next() === false; } public function release($x, $y) { $this->bord[$x][$y] = 0; } public function string($x_r=null,$y_r=null) { $str = ''; foreach ($this->bord as $x => $array) { foreach ($array as $y => $v) { if($x_r && $y_r && $x_r==$x && $y_r==$y){ $str .= '<span style="color:red">'.$v . '</span> '; }else{ $str .= $v . ' '; } } $str .= '<br/>'; } return $str; } public function __toString() { $str = ''; foreach ($this->bord as $x => $array) { foreach ($array as $y => $v) { $str .= $v . ' '; } $str .= '<br/>'; } return $str; }}$bord = new bord(array_fill(1,9,array_fill(1,9,0)));$bord ->run();echo $bord ;