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 相关文章推荐
c#中的实现php中的preg_replace
Dec 21 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
php快递单号查询接口使用示例
May 05 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
PHP使用自定义方法实现数组合并示例
Jul 07 PHP
PHP创建多级目录的两种方法
Oct 28 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
Laravel框架自定义分页样式操作示例
Jan 26 PHP
基于PHP的登录和注册的功能的实现
Aug 06 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
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
python获得一个月有多少天的方法
2015/06/04 Python
python创建临时文件夹的方法
2015/07/06 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Django中Forms的使用代码解析
2018/02/10 Python
详解Python的循环结构知识点
2019/05/20 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python中调试或排错的五种方法示例
2019/09/12 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
教师实习自我鉴定
2013/12/14 职场文书
普罗米修斯教学反思
2014/02/06 职场文书
实习生岗位职责
2014/04/12 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
2014年团工作总结
2014/11/27 职场文书
测量员岗位职责
2015/02/14 职场文书
MySQL 使用自定义变量进行查询优化
2021/05/14 MySQL
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript