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 相关文章推荐
笑谈配置,使用Smarty技术
Jan 04 PHP
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
php的正则处理函数总结分析
Jun 20 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
PHP滚动日志的代码实现
Jun 10 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
PHPCMS2008广告模板SQL注入漏洞修复
Oct 11 PHP
php7安装mongoDB扩展的方法分析
Aug 02 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 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/11/16 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
如何进行Linux分区优化
2016/09/13 面试题
护理专业大学生自我推荐信
2014/01/25 职场文书
廉洁自律承诺书
2014/03/27 职场文书
勤俭节约倡议书
2014/04/14 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server