PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析


Posted in PHP onMay 29, 2017

本文实例讲述了PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法。分享给大家供大家参考,具体如下:

回环矩阵指的是一个从一开始,不断按照上、右、下、左顺序依次增大的矩阵序列,例:

1 2 3
8 9 4
7 6 5

现在要求:

输入: m、n,分别代表行数和列数
输出: m * n 的回环矩阵

例:

输入:

7 8

输出:

1 2 3 4 5 6 7 8
26 27 28 29 30 31 32 9
25 44 45 46 47 48 33 10
24 43 54 57 56 49 34 11
23 42 53 52 51 50 35 12
22 41 40 39 38 37 36 13
21 20 19 18 17 16 15 14

接下来我们用 PHP 来实现,这里我们将其封装成函数调用

第一种思路

直接按照上、右、下、左的顺序进行遍历,计算好遍历层数就OK了

function snake($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 "<br />";
  }
}
snake(7, 8);

第二种思路

这种思路与第一种思路类似,不过是通过一个 while 全部遍历,然后通过一个标志位 up right down left 来判断与修改当前方向,通过 while 内的 if 来对标志位进行判断,这种就不贴代码了

第三种思路

使用一个迭代器来控制方向,然后进行 m * n 次循环,通过判断宽高和 isset 来确定是否转弯,思路很棒,代码量大大减少,表示没有想到这种方式。。

/* *
 * @param $w : 宽
 * @param $h : 高
 * @param $s : 起始数字
 * @param $x, $y : 起始位置坐标 只能从四顶点开始
 * @param $r :方向 默认顺时间 false为逆时针
 *
 */
function print_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 = new InfiniteIterator(new ArrayIterator($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 "<br />";
  }
}
PHP 相关文章推荐
用PHP动态生成虚拟现实VRML网页
Oct 09 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
Jun 01 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
laravel中命名路由的使用方法
Feb 24 PHP
PHP ADODB实现分页功能简单示例
May 25 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 PHP
PHP底层运行机制与工作原理详解
Jul 31 PHP
PHP实现的简单AES加密解密算法实例
May 29 #PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 #PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 #PHP
PHP 网站修改默认访问文件的nginx配置
May 27 #PHP
yii插入数据库防并发的简单代码
May 27 #PHP
[原创]php正则删除img标签的方法示例
May 27 #PHP
浅谈PHP错误类型及屏蔽方法
May 27 #PHP
You might like
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python中的闭包用法实例详解
2015/05/05 Python
TensorFlow实现创建分类器
2018/02/06 Python
深入浅析Python传值与传址
2018/07/10 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
一年级数学教学反思
2014/02/01 职场文书
英语感谢信范文
2015/01/20 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
商业计划书之服装
2019/09/09 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL
mysql如何配置白名单访问
2021/06/30 MySQL
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL