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实现递归循环每一个目录
Aug 08 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
PHP新手入门学习方法
May 08 PHP
PHP高级对象构建 工厂模式的使用
Feb 05 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
php 解决旧系统 查出所有数据分页的类
Aug 27 PHP
基于php split()函数的用法详解
Jun 05 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 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下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
php获取当前时间的毫秒数的方法
2014/01/26 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
arguments对象
2006/11/20 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
python Tkinter的图片刷新实例
2019/06/14 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
python用requests实现http请求代码实例
2019/10/31 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
自我评价个人范文
2013/12/16 职场文书
运动会跳远广播稿
2014/02/04 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
森林病虫害防治方案
2014/06/02 职场文书
求职教师自荐书
2014/06/19 职场文书
人力资源职位说明书
2014/07/29 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python