這篇文章主要介紹了PHP實現蛇形矩陣,迴環矩陣及數字螺旋矩陣的方法,結合具體執行個體形式分析了蛇形矩陣,迴環矩陣及數字螺旋矩陣的概念、表示方法及php實現技巧,需要的朋友可以參考下
具體如下:
迴環矩陣指的是一個從一開始,不斷按照上、右、下、左順序依次增大的矩陣序列,例:
1 2 38 9 47 6 5
現在要求:
輸入: m、n,分別代表行數和列數
輸出: m * n 的迴環矩陣
例:
輸入:
7 8
輸出:
1 2 3 4 5 6 7 826 27 28 29 30 31 32 925 44 45 46 47 48 33 1024 43 54 57 56 49 34 1123 42 53 52 51 50 35 1222 41 40 39 38 37 36 1321 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實現順時針列印矩陣(螺旋矩陣)的方法樣本
PHP實現二維數組的矩陣轉置操作的方法及案例