PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
本文实例讲述了PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法。分享给大家供大家参考,具体如下:
回环矩阵指的是一个从一开始,不断按照上、右、下、左顺序依次增大的矩阵序列,例:
123 894 765
现在要求:
输入:m、n,分别代表行数和列数
输出:m*n的回环矩阵
例:
输入:
78
输出:
12345678 262728293031329 2544454647483310 2443545756493411 2342535251503512 2241403938373613 2120191817161514
接下来我们用PHP来实现,这里我们将其封装成函数调用
第一种思路
直接按照上、右、下、左的顺序进行遍历,计算好遍历层数就OK了
functionsnake($row=5,$col=5)
{
//结果集
$res=array();
//初始值
$start=1;
//当前遍历层数
$flag=intval(($row+1)/2);
for($i=1;$i<=$flag;$i++){
$startX=$i-1;
$startY=$i-1;
$width=$col-$i+1;
$height=$row-$i+1;
//上
for($u=$startY;$u<$width;$u++){
$res[$startX][$u]=$start;
$start+=1;
}
//右
for($r=$startX+1;$r<$height;$r++){
$res[$r][$u-1]=$start;
$start+=1;
}
//下
for($d=$u-1-1;$d>=$startY;$d--){
$res[$r-1][$d]=$start;
$start+=1;
}
//左
for($l=$r-1-1;$l>=$startX+1;$l--){
$res[$l][$d+1]=$start;
$start+=1;
}
}
//输出
for($i=0;$i<$row;$i++){
for($j=0;$j<$col;$j++){
echo$res[$i][$j]."";
}
echo"
";
}
}
snake(7,8);
第二种思路
这种思路与第一种思路类似,不过是通过一个while全部遍历,然后通过一个标志位uprightdownleft来判断与修改当前方向,通过while内的if来对标志位进行判断,这种就不贴代码了
第三种思路
使用一个迭代器来控制方向,然后进行m*n次循环,通过判断宽高和isset来确定是否转弯,思路很棒,代码量大大减少,表示没有想到这种方式。。
/**
*@param$w:宽
*@param$h:高
*@param$s:起始数字
*@param$x,$y:起始位置坐标只能从四顶点开始
*@param$r:方向默认顺时间false为逆时针
*
*/
functionprint_matrix($w,$h,$s=1,$l=1,$x=0,$y=0,$r=true){
//表示四个方向
$R=array(array(1,0),array(0,1),array(-1,0),array(0,-1));
!$r&&$R=array_reverse($R);
//创建一个无限迭代器
$iterator=newInfiniteIterator(newArrayIterator($R));
$iterator->rewind();
list($_x,$_y)=$iterator->current();
$result=[];
$result[$x][$y]=$s;
for($i=$s+1;$i<($s+$w*$h);$i++){
$new_x=$x+$_x;
$new_y=$y+$_y;
if(0<=$new_x&&0<=$new_y&&$new_x<$w&&$new_y<$h&&!isset($result[$new_x][$new_y])){
$result[$new_x][$new_y]=$i;
$x=$new_x;
$y=$new_y;
}else{
$iterator->next();
list($_x,$_y)=$iterator->current();
$i--;
}
}
//打印
for($i=0;$i<$h;$i++){
for($j=0;$j<$w;$j++){
echo$result[$j][$i],"\t";
}
echo"
";
}
}
PS:这里再为大家推荐几款在线计算工具供大家参考使用:
在线一元函数(方程)求解计算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue
在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数学运算技巧总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php正则表达式用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。