什么叫做回形遍历数组
大概是这么个东西
思路
步骤拆分 :
->写打印二维数组的方法, 能直观看到数据
private function p(array $res)
{
foreach ($res as $re) {
foreach ($re as $item) {
printf('%03d',$item);
echo ' ';
}
echo '<br/>';
}
}
->先构建一个空的数组
$tmp = array_fill(0,10,'');
$arr = array_fill(0,10,$tmp);
$this->p($arr);
->由外往内, 一圈圈来. 先画一个圈
private function clip(array $arr)
{
$num = 0;
$row = count($arr);
$col = count($arr[0]);
for ($i=0; $i<=ceil($row/2)&&$i<ceil($col/2); $i++){
//这里面画一个圈
}
return $arr;
}
上边
//这里面画一个圈
//top
$x = $i;
for ($y=$i;$y<$col-$i;$y++){
$arr[$x][$y] = ++$num;
}
右边
//这里面画一个圈
//right
$y=$col-$i-1;
for ($x=$i+1; $x<$row-$i; $x++){
$arr[$x][$y] = ++$num;
}
下边 左边
//bottom
$x=$row-$i-1;
for ($y=$col-$i-2; $y>=$i; $y--){
$arr[$x][$y] = ++$num;
}
//left
$y = $i;
for ($x=$row-$i-2; $x>$i; $x--){
$arr[$x][$y] = ++$num;
}
完整的, 看着没啥问题
换成5*5的
似乎哪里不对,最后一圈右边被左边覆盖了
加上临界值
//最后一圈且共有基数行或基数列
if (($row%2&&$i>=intval($row/2)) || ($col%2&&$i>=intval($col/2))){
return $arr;
}
完整代码如下
private function clip(array $arr)
{
$num = 0;
$row = count($arr);
$col = count($arr[0]);
for ($i=0; $i<=ceil($row/2)&&$i<ceil($col/2); $i++){
//top
$x = $i;
for ($y=$i;$y<$col-$i;$y++){
$arr[$x][$y] = ++$num;
}
//right
$y=$col-$i-1;
for ($x=$i+1; $x<$row-$i; $x++){
$arr[$x][$y] = ++$num;
}
//最后一圈且共有基数行或基数列
if (($row%2&&$i>=intval($row/2)) || ($col%2&&$i>=intval($col/2))){
return $arr;
}
//bottom
$x=$row-$i-1;
for ($y=$col-$i-2; $y>=$i; $y--){
$arr[$x][$y] = ++$num;
}
//left
$y = $i;
for ($x=$row-$i-2; $x>$i; $x--){
$arr[$x][$y] = ++$num;
}
}
return $arr;
}