蛇形矩阵,回环矩阵,数字螺旋矩阵的PHP实现

来源:互联网 发布:火车票二维码扫描软件 编辑:程序博客网 时间:2024/05/22 00:36

回环矩阵指的是一个从一开始,不断按照上、右、下、左顺序依次增大的矩阵序列,例:

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为逆时针 * @author : http://www.zh30.com/php-python-shuzi-luoxuan-juzhen.html *  */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 />";    }}
3 0
原创粉丝点击