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中的一个中文字符串截取函数
Feb 14 PHP
PHP 第三节 变量介绍
Apr 28 PHP
php获取从百度搜索进入网站的关键词的详细代码
Jan 08 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
详解PHP实现执行定时任务
Dec 21 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
php实现多维数组排序的方法示例
Mar 23 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
Javascript 获取LI里的内容
2008/12/17 Javascript
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
Python中for循环控制语句用法实例
2015/06/02 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
详解python中eval函数的作用
2019/10/22 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
python如何使用腾讯云发送短信
2020/09/17 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
老板电器官方购物商城:老板油烟机、燃气灶、消毒柜、电烤箱
2018/05/30 全球购物
玩具公司的创业计划书
2013/12/31 职场文书
办护照工作证明范本
2014/01/14 职场文书
如何写早恋检讨书
2014/09/10 职场文书
担保贷款承诺书
2015/04/30 职场文书
婚庆开业庆典主持词
2015/06/30 职场文书
养成教育工作总结
2015/08/13 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL