继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

php数独求解

jeck猫
关注TA
已关注
手记 298
粉丝 74
获赞 402

<?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/>';
}

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP