面试题:写一个函数有一个整数的参数【>=3】,根据这个整数输出图形:
n = 3;
3 4 5
10 11 6
n = 3;
3 4 5
10 11 6
9 8 7
<?php
/*
思路:
1. 矩阵用一个二维数组:
$arr = array(
array(3,0,0),
array(0,0,0),
array(0,0,0),
);
$arr[$x][$y] -> $arr[0][0] -> $arr[0][1]
2. 移动的算法
向右移动 $y++
右左移动 $y--
向下移动 $x++
向中移动 $x--
3. 向一个方向的移动条件,比如向右:a. 不能出框 b. 下一个格没有被占【如果值是0代表没有被占用】
4. 移动方向是 上==右==下==左
*/
function fz($num){
if($num<3){
echo "输入的数据必须大于3";
exit();
}
//$arr[]=="";
//初始化数据 执行思路1
for($i=0;$i<$num;$i++)
for($j=0;$j<$num;$j++)
$arr[$i][$j]=0;
/****************初始化几个要用到的变量************************/
$direction='right';//开始移动的方向 right代表向右 left代表向左 up代表向上 down代表向下
$maxNum=$num + $num * $num - 1;//表示这个矩阵最大的数字
$x=$y=0;//要放置数字的坐标
//开始赋值
for($i=$num;$i<=$maxNum;$i++){
//如果这个位置的值为0 说明可以进行赋值
if($arr[$x][$y]==0){
$arr[$x][$y]=$i;
}else{
//如果这个位置值不为0,则执行移动操作
if($direction=='right'){
if(($y+1) < $num && $arr[$x][$y+1] == 0)
$y++;
else
$direction = 'down';
}
if($direction=='down'){
if(($x+1) < $num && $arr[$x+1][$y] == 0)
$x++;
else
$direction = 'left';
}
if($direction=='left'){
if(($y-1) >=0 && $arr[$x][$y-1] == 0)
$y--;
else
$direction = 'up';
}
if($direction=='up'){
if(($x-1) >=0 && $arr[$x-1][$y] == 0)
$x--;
else{
$direction = 'right';
if($direction=='right'){
if(($y+1) < $num && $arr[$x][$y+1] == 0)
$y++;
else
$direction = 'down';
}
}
}
$arr[$x][$y]=$i;
}
}
/***********************输出图像******************************/
$table="<table border='1'>";
foreach ($arr as $v) {
$table.="<tr>";
foreach ($v as $v1) {
$table.="<td>".$v1."</td>";
}
$table.="</tr>";
}
$table.="</table>";
echo $table;
}
fz(15);