<?php
/*
* @parm array &$data
* @parm int $i x
* @parm int $j y
* return bool
*/
function checksd(&$data, $i ,$j)
{
if(empty($data)||(empty($i)&&$i!=0)||(empty($j)&&$j!=0))
{
echo __FILE__.__LINE__."参数错误";
return false;
}
//判断当前行
for($m=0; $m<9; $m++ )
{
if($data[$i][$j] == $data[$i][$m] && ($m!=$j))
{ return false;}
}
//判断列
for($m=0; $m<9; $m++)
{
if($data[$i][$j] == $data[$m][$j] && ($m!=$i))
{ return false; }
}
$ti = (floor($i%3)) * 3 + $m;
$tj = (floor($j%3)) * 3 + $n;
for($m=0; $m<$ti; $m++)
{
for($n=0; $n<$tj; $n++)
{
if($data[$i][$j] == $data[$ti][$tj] && ($m != $i || $n != $j))
{ return false; }
}
}
return true;
}
$initdata = array(
array(0,0,3,0,0,2,0,4,1),
array(4,0,1,9,0,0,0,2,6),
array(0,0,0,4,0,0,9,0,0),
array(0,3,0,0,0,0,5,1,8),
array(0,5,9,0,0,0,2,6,0),
array(2,1,4,0,0,0,0,9,0),
array(0,0,7,0,0,8,0,0,0),
array(1,8,0,0,0,9,4,0,7),
array(9,6,0,7,0,0,1,0,0)
);
suduku($initdata, 0);
/*
* @parm array $data
* @parm int $n
* return array
*/
function suduku($data, $h)
{
$temp = array();
for($m=0; $m<9; $m++)
{
for($n=0; $n<9; $n++)
{
$temp[$m][$n] = $data[$m][$n];
}
}
$i = floor($h/9);
$j = floor($h%9);
if($temp[$i][$j] != 0)
{
if($h == 80)
{
prisd($temp);
}
else
{
suduku($data, $h+1);
}
}
else
{
for($k=1; $k<10; $k++)
{
$temp[$i][$j] = $k;
$flag = checksd($temp, $i, $j);
// var_dump($flag);
// echo ($h. ' '.$i .' '.$j.' '.$k);
if($flag)
{
if($h == 80)
prisd($temp);
else
{
// echo ($h. ' '.$i .' '.$j.' '.$k ).' guo <br/>';
suduku($temp, $h+1);
}
$temp[$i][$j] = 0;
}
}
}
}
/*
* @parm array $data
* void
*/
function prisd(&$data)
{
for($m=0; $m<9; $m++)
{
for($n=0; $n<9; $n++)
{
echo $data[$m][$n]." ";
}
echo '<br/>';
}
echo '<br/>------------------------------<br/>';
}