写一个函数需要一个参数,根据这个参数输出一个图形
<?php
/* 算法二、写一个函数需要一个参数,根据这个参数输出一个图形,
比如:输入4:
4 5 6 7
15 16 17 8
14 19 18 9
13 12 11 10
比如:输入3:
3 4 5
10 11 6
9 8 7
*/
/*
3*3+3-1 --> 11
4*4+4-1 --> 19
$arr = [
[0,0,0],
[0,0,0],
[0,0,0],
];
x y
$arr[0][0] = 3;
$arr[0][1] = 4;
向右移动y++
向左移动y--
左下移动x++
移动的条件:
1. y++ < $num 没出框
2. $arr[$x][$y+1] == 0 【没被占用】
$arr = [
[3,4,5],
[10,11,6],
[9,8,7],
];
*/
function jz($num)
{
/************************* 先构造二维数组 ********************/
for($i=0; $i<$num; $i++)
{
for($j=0; $j<$num; $j++)
{
$map[$i][$j] = 0;
}
}
/************************* 循环往数组中放 ********************/
// 计算最后一个数
$end = $num * $num + $num - 1;
// 初始化要放的位置
$x = $y = 0;
// 初始化方向 // r:右 l:左 t:上 b:下
$d = 'r';
// 先把第一个数放进去
$map[$x][$y] = $num;
// 循环放从第二个数开始放
for($i=$num+1; $i<=$end; $i++)
{
if($d == 'r')
{
if($y+1 < $num && $map[$x][$y+1] == 0)
$y++; // 修改坐标
else
$d = 'b';
}
if($d == 'b')
{
if($x+1 < $num && $map[$x+1][$y] == 0)
$x++; // 修改坐标
else
$d = 'l';
}
if($d == 'l')
{
if($y-1 >= 0 && $map[$x][$y-1] == 0)
$y--; // 修改坐标
else
$d = 't';
}
if($d == 't')
{
if($x-1 >= 0 && $map[$x-1][$y] == 0)
$x--; // 修改坐标
else
{
$d = 'r';
$y++; // 修改坐标
}
}
// 把数进来
$map[$x][$y] = $i;
}
/***************************** 画出图形 **************************/
$table = '<table border="1">';
for($i=0; $i<$num; $i++)
{
$table .= '<tr>';
for($j=0; $j<$num; $j++)
{
$table .= '<td>';
$table .= $map[$i][$j];
$table .= '</td>';
}
$table .= '</tr>';
}
$table .= '</table>';
echo $table;
}
jz(20);
?>