加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

数独解题法之-空矩形(empty rectangle)

(2007-12-31 23:10:48)
标签:

休闲

数独解题法之-空矩形(empty <wbr>rectangle)
数独解题法之-空矩形(empty <wbr>rectangle) 数独解题法之-空矩形(empty <wbr>rectangle)
这个并不难理解,如果在一个宫内只有一行+一列有这个候选数的话,那么它要么在行上要么在列上(也可以既在行上也在列上),通过与之对应的强链的传递,当在列上时可以直接摒蔽掉D上的候选数,当在行上时对应的强链上端不包含则下端包含,也可摒蔽掉D上的候选数。
 

//Empty Rectangle (ER)
$emptyplace = array(
 0 => array(10,11,19,20),
 1 => array( 9,11,18,20),
 2 => array( 9,10,18,19),
 9 => array( 1, 2,19,20),
 10=> array( 0, 2,18,20),
 11=> array( 0, 1,18,19),
 18=> array( 1, 2,10,11),
 19=> array( 0, 2, 9,11),
 20=> array( 0, 2, 9,10)
);

function ergetpairs($arrdu,$num)
{
 GLOBAL $rule,$r_row,$r_col,$r_box;
 $rar = array();
 foreach($rule as $i => $rn)
 {
  $j=0;$t = array();
  foreach($rn as $k)
  if($arrdu[$k]{0} === '0' && (strpos($arrdu[$k],"$num")!== false) )
  {
   $j++;
   $t[]=$k;
  }

  if($j==2 && ($r_box[$t[0]] != $r_box[$t[1]]))
  {
   //echo "--- $i $t[0] $t[1]\n";
   $rar[]=array($i,$t[0],$t[1]);
   $rar[]=array($i,$t[1],$t[0]);
  }
 }
 return $rar;
}

function emptyrect(&$arrdu)
{
 GLOBAL $rule,$initstr,$r_row,$r_col,$r_box,$emptyplace;
 $narr = str_split(substr($initstr,1)); //1,2,3,4,...
 $ret = 0;
 
 foreach($narr as $num)
 {
  $allpair = ergetpairs($arrdu,$num);
  //找C
  foreach($arrdu as $p => $c)if($c{0} == '0' && strpos($c,$num) !== false)
  {
   //判断是否为空矩形
   $cbase = ((int)((int)($p/9)/3))*27+((int)($p%9/3))*3;
   $cchk  = 0;
   foreach($emptyplace[$p - $cbase] as $q)
   if($arrdu[$cbase+$q]{0} == '0')
   {
    if(strpos($arrdu[$cbase+$q],$num) !== false)continue 2;
   }
   //四空
   //找
   foreach($allpair as $q)
   if($r_box[$p] != $r_box[$q[1]] && $r_box[$p] != $r_box[$q[2]])
   {
    if($r_row[$q[1]] == $r_row[$p] && $r_row[$q[2]] != $r_row[$p])
    {
     $s=((int)($q[2]/9))*9 + $p%9;
     if(strpos($arrdu[$s],$num))
     {
      //找到删减之
      $ret = 1;
      $old = $arrdu[$s];
      $arrdu[$s] = str_replace($num,'',$old);
      if($GLOBALS['debug'])
       echo "Empty RectA:C:".bit2place($p).
        "AB:".bit2place($q[1]).bit2place($q[2])." *".
        bit2place($s).$old."=>".$arrdu[$s]."\n";
     }
    }else
    if($r_col[$q[1]] == $r_col[$p] && $r_col[$q[2]] != $r_col[$p])
    {
     $s=((int)($p/9))*9 + $q[2]%9;
     if(strpos($arrdu[$s],$num))
     {
      //找到删减之
      $ret = 1;
      $old = $arrdu[$s];
      $arrdu[$s] = str_replace($num,'',$old);
      if($GLOBALS['debug'])
       echo "Empty RectB:C:".bit2place($p).
        "AB:".bit2place($q[1]).bit2place($q[2])." *".
        bit2place($s).$old."=>".$arrdu[$s]."\n";
     }
    }
   }
  }
 }
 return $ret;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有