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程序设计有所帮助。