标签:
休闲 |
//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;
}

加载中…