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 str_pad 函数使用详解
Jan 13 PHP
php 文件夹删除、php清除缓存程序
Aug 25 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
php 代码优化之经典示例
Mar 24 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
PHP防止跨域提交表单
Nov 01 PHP
Yii使用ajax验证显示错误messagebox的解决方法
Dec 03 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
Jun 29 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
PHP双向链表定义与用法示例
Jan 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
php Try Catch异常测试
2009/03/01 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
用javascript实现读取txt文档的脚本
2007/07/20 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
JS实现加载和读取XML文件的方法详解
2017/04/24 Javascript
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
解决Vue router-link绑定事件不生效的问题
2020/07/22 Javascript
Python基于smtplib协议实现发送邮件
2020/06/03 Python
python批量修改文件名的示例
2020/09/27 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
行政管理专业求职信
2014/07/06 职场文书
实习计划书范文
2015/01/16 职场文书
政府会议通知范文
2015/04/15 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
思想品德课教学反思
2016/02/24 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
Redis可视化客户端小结
2021/06/10 Redis
springcloud整合seata
2022/05/20 Java/Android