PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析

阅读次数:1377 次  |  发布时间:2019-02-04T00:00:00Z 

本文实例讲述了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 />";
      }
    }
    
    

PS:这里再为大家推荐几款在线计算工具供大家参考使用:

**在线一元函数(方程)求解计算工具:
**http://tools.jb51.net/jisuanqi/equ_jisuanqi

**科学计算器在线使用_高级计算器在线计算:
**http://tools.jb51.net/jisuanqi/jsqkexue

**在线计算器_标准计算器:
**http://tools.jb51.net/jisuanqi/jsq

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数学运算技巧总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php正则表达式用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

最近发布的代码:

获取php时间戳 PHP 程序  |  7次阅读  | 发布于:2020-08-01T23:05:19Z
php获取tempfile路径 PHP 程序  |  7次阅读  | 发布于:2020-08-01T23:03:16Z
php 1,1,2,3,5,8,13,21,34...求第30位的数是多少? PHP 程序  |  11次阅读  | 发布于:2020-08-01T23:03:00Z
PHP执行shell PHP 程序  |  22次阅读  | 发布于:2020-02-08T16:48:28Z
PHP获取HTTP body内容 PHP 程序  |  53次阅读  | 发布于:2019-12-09T14:35:47Z
php读取目录下的所有文件 PHP 程序  |  59次阅读  | 发布于:2019-11-18T18:50:49Z
php判断是爬虫在访问还是用户浏览器在访问 PHP 程序  |  62次阅读  | 发布于:2019-11-12T19:16:47Z
PHP通过UserAgent识别爬虫 PHP 程序  |  49次阅读  | 发布于:2019-11-12T19:16:03Z
PHP使用curl发起post请求 PHP 程序  |  61次阅读  | 发布于:2019-11-10T21:43:33Z
PHP版HelloWorld PHP 程序  |  47次阅读  | 发布于:2019-10-31T00:14:24Z
实现水仙花数的5个示例 PHP 程序  |  83次阅读  | 发布于:2019-10-29T23:22:58Z
PHP输出所有位数的水仙花 PHP 程序  |  41次阅读  | 发布于:2019-10-28T08:44:36Z
PHP水仙花数实现代码 PHP 程序  |  45次阅读  | 发布于:2019-10-28T08:38:23Z
根据文件后缀判断是否为代码文件 PHP 程序  |  82次阅读  | 发布于:2019-10-20T14:39:03Z
PHP判断访问者是否为手机 PHP 程序  |  78次阅读  | 发布于:2019-10-20T14:37:38Z
PHP判断字符是否以xxx开头 PHP 程序  |  74次阅读  | 发布于:2019-10-10T01:55:24Z
PHP压缩文件 PHP 程序  |  100次阅读  | 发布于:2019-10-10T01:53:17Z
PHP解压文件 PHP 程序  |  43次阅读  | 发布于:2019-10-10T01:51:36Z
PHP生成随机字符串 PHP 程序  |  54次阅读  | 发布于:2019-10-10T01:49:40Z
PHP判断路径是否合法,不能有./ ../等安全隐患 PHP 程序  |  97次阅读  | 发布于:2019-10-10T01:48:56Z
PHP在服务端通过浏览器的User-Agent判断网页的客户端类型 PHP 程序  |  76次阅读  | 发布于:2019-10-10T01:26:15Z
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态 PHP 程序  |  1123次阅读  | 发布于:2019-02-04T00:00:00Z
WordPress的主题编写中获取头部模板和底部模板 PHP 程序  |  1084次阅读  | 发布于:2019-02-04T00:00:00Z
PHP实现批量清空删除指定文件夹所有内容的方法 PHP 程序  |  1041次阅读  | 发布于:2019-02-04T00:00:00Z
PHP面向对象继承用法详解(优化与减少代码重复) PHP 程序  |  989次阅读  | 发布于:2019-02-04T00:00:00Z
玩转虚拟域名◎+ . PHP 程序  |  909次阅读  | 发布于:2019-02-04T00:00:00Z
值得分享的php+ajax实时聊天室 PHP 程序  |  936次阅读  | 发布于:2019-02-04T00:00:00Z
PHP中使用substr()截取字符串出现中文乱码问题该怎么办 PHP 程序  |  933次阅读  | 发布于:2019-02-04T00:00:00Z
模仿OSO的论坛(二) PHP 程序  |  853次阅读  | 发布于:2019-02-04T00:00:00Z
sqlyog 中文乱码问题的设置方法 PHP 程序  |  859次阅读  | 发布于:2019-02-04T00:00:00Z

最多阅读的代码

 PHP分页显示制作详细讲解 PHP 程序  |  2116次阅读
 在Zeus Web Server中安装PHP语言支持 PHP 程序  |  1658次阅读
 再谈PHP中单双引号的区别详解 PHP 程序  |  1617次阅读
 PHP实现简单爬虫的方法 PHP 程序  |  1570次阅读
 php+ajax+json 详解及实例代码 PHP 程序  |  1567次阅读
 桌面中心(一)创建数据库 PHP 程序  |  1542次阅读
 PHP设计模式之工厂模式与单例模式 PHP 程序  |  1541次阅读
 php封装的page分页类完整实例 PHP 程序  |  1540次阅读
 php数组合并array_merge()函数使用注意事项 PHP 程序  |  1533次阅读
 Yii2汉字转拼音类的实例代码 PHP 程序  |  1512次阅读
 使用WAMP搭建PHP本地开发环境 PHP 程序  |  1383次阅读
 redirect_uri参数错误的解决方法(必看) PHP 程序  |  1371次阅读
 thinkPHP5.0框架简单配置作用域的方法 PHP 程序  |  1370次阅读
 php查询及多条件查询 PHP 程序  |  1369次阅读
 Zend Framework分发器用法示例 PHP 程序  |  1342次阅读
 php连接oracle数据库的方法(测试成功) PHP 程序  |  1341次阅读
 PHP实现根据银行卡号判断银行 PHP 程序  |  1340次阅读
 PHP Header用于页面跳转时的几个注意事项 PHP 程序  |  1330次阅读
 PHP 生成的XML以FLASH获取为乱码终极解决 PHP 程序  |  1325次阅读
 php封装一个异常的处理类 PHP 程序  |  1325次阅读
 ThinkPHP3.1新特性之Action参数绑定 PHP 程序  |  1321次阅读
 mantis安装、配置和使用中的问题小结 PHP 程序  |  1321次阅读
 PHP环境搭建最新方法 PHP 程序  |  1314次阅读