[one_demo_3]漩涡递增矩阵
<?php
/**
* 写一个函数有一个整数的参数(>=3),根据这个整数输出图形
* n = 3
* 3 4 5
* 10 11 6
* 9 8 7
* 思路
* 1,用一个二维数组存放这个矩阵
* $arr = array(
* array(0,0,0),
* array(0,0,0),
* array(0,0,0),
* );
* 2,矩阵的数据的变化模拟为上下左右的移动,移动一下加1
* 移动的算法是数组的下标的变化
* 向右移动 $y++
* 向下移动 $x++
* 向左移动 $y--
* 向上移动 $x--
* 3,移动的条件
* 比如向右移动,
* a,不能超出数组这个方向的最大坐标,
* b,下一个位置没有被占用,也就是$arr[x][y]=0。
* 其他,同理,向左和上是需要考虑最小值大于等于0
*/
function jz($num)
{
if($num < 3)
{
die('must greater than 3');
}
//拼出二维数组
for ($i=0; $i<$num; $i++)
{
for ($j=0; $j<$num; $j++)
{
$arr[$i][$j] = 0;
}
}
//初始化变量
$direction = 'r';//r 右 l 左 t 上 b下
$maxNum = $num * $num + $num -1;//计算出最后一个数
$x = $y = 0;//放的格子的坐标
//循环每个数字,放到数组相应的位置
for ($i=$num; $i<=$maxNum; $i++)
{
if($arr[$x][$y] == 0)
{
$arr[$x][$y] = $i;
}else
{
if($direction == 'r')
{
if(($y+1) < $num && $arr[$x][$y+1] == 0)
{
$y++;
}
else
{
$direction = 'b';
}
}
if($direction == 'b')
{
if(($x+1) < $num && $arr[$x+1][$y] == 0)
{
$x++;
}
else
{
$direction = 'l';
}
}
if($direction == 'l')
{
if(($y-1) >= 0 && $arr[$x][$y-1] == 0)
{
$y--;
}
else
{
$direction = 't';
}
}
if($direction == 't')
{
if(($x-1) >= 0 && $arr[$x-1][$y] == 0)
{
$x--;
}
else
{
$direction = 'r';
if($direction == 'r')
{
if(($y+1) < $num && $arr[$x][$y+1] == 0)
{
$y++;
}
else
{
$direction = 'b';
}
}
}
}
$arr[$x][$y] = $i;
}
}
$table = '<table>';
foreach ($arr as $k => $v)
{
$table .= '<tr>';
foreach ($v as $k1 => $v1)
{
$table .= '<td>'.$v1.'</td>';
}
$table .= '</tr>';
}
$table .= '</table>';
echo $table;
}
jz(15);