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为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
php 无限级 SelectTree 类
May 19 PHP
PHP 输出缓存详解
Jun 20 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
apache mysql php 源码编译使用方法
May 03 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
实例讲解PHP页面静态化
Feb 05 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 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
动态生成gif格式的图像要注意?
2006/10/09 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
php流量统计功能的实现代码
2012/09/29 PHP
三种php连接access数据库方法
2013/11/11 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
几道数据库的面试题或笔试题
2014/05/31 面试题
人力资源主管职责范本
2014/03/05 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
会计专业自荐信范文
2015/03/05 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
资产移交协议书
2016/03/24 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers