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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
PHP 错误之引号中使用变量
May 04 PHP
PHP 一个随机字符串生成代码
May 26 PHP
php strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
php中取得文件的后缀名?
Feb 20 PHP
php缩小png图片不损失透明色的解决方法
Dec 25 PHP
php数组中包含中文的排序方法
Jun 03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
Jun 24 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
php、java、android、ios通用的3des方法(推荐)
Sep 09 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
967 个函式
2006/10/09 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
2019/08/05 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
详解在Python程序中自定义异常的方法
2015/10/16 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
你常见到的runtime exception
2016/09/05 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
党员自我批评与反省材料
2014/02/10 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
营业员岗位职责范本
2015/04/14 职场文书
聚会通知怎么写
2015/04/23 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js