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 相关文章推荐
基于文本的搜索
Oct 09 PHP
php桌面中心(二) 数据库写入
Mar 11 PHP
mysql+php分页类(已测)
Mar 31 PHP
php MYSQL 数据备份类
Jun 19 PHP
php zip文件解压类代码
Dec 02 PHP
PHP重定向的3种方式
Mar 07 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
深入浅析php json 格式控制
Dec 24 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP与已存在的Java应用程序集成
2006/10/09 PHP
基于文本的留言簿
2006/10/09 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
jQuery封装placeholder效果实现方法,让低版本浏览器支持该效果
2017/07/08 jQuery
vue组件父子间通信详解(三)
2017/11/07 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
商务英语专业应届毕业生求职信
2013/10/28 职场文书
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
个人简历自我评价范文
2014/02/04 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
银行职员自我鉴定
2014/04/20 职场文书
小学节能减排倡议书
2014/05/15 职场文书
拉歌口号大全
2014/06/13 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
高中数学教学反思范文
2016/02/18 职场文书
python绘制箱型图
2021/04/27 Python