1. 程式人生 > >PHP實現螺旋矩陣(螺旋陣列)

PHP實現螺旋矩陣(螺旋陣列)

今天碰到一個比較有意思的問題, 就是把A到Y這25個字母以下面的形式輸出出來

A B C D E
P Q R S F
O X Y T G
N W V U H
M L K J I
問題很有意思,就是轉圈圈把字母填到表格中,要輸出這樣的格式,其實就需要構造一個下面這樣的表格
1 2 3 4 5
16 17 18 18 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
這其實是一個螺旋矩陣的問題, 這跟下面這個問題本質是一樣的: 給定一個行數row和列數cols, 輸出對應的螺旋陣列,  比如3行5列
1 2 3 4 5
12 13 14 15 6
11 10 9 8 7
又比如5行3列
1 2 3
12 13 4
11 14 5
10 15 6
9 8 7
解決這個問題可能有多種辦法, 但是我的思路是按上、右、下、左四個方向不停的往裡面畫圈,如下圖 思路有了,接下來就是寫程式碼的事了,閒話少說,上程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 /** * 根據傳入的行數和列數生成螺旋陣列 * @author chenqionghe * @param int $row 行數
* @param int $col 列數 * @return array */ function rotationSort($row=5,$col=5) { $k=1; $result = array(); $small = $col < $row ? $col : $row; $count = ceil($small / 2); for($i=0; $i<$count; $i++) { $maxRight = $col-1-$i;//右邊最大座標 $maxBottom = $row -1 -$i;//下面最大座標 for($j=$i; $j<=$maxRight; $j++)          
//構造上邊一條線  縱座標最小,橫座標遞增 { $result[$i][$j] = $k++; } for($j=$i; $j<$maxBottom; $j++)           //構造右邊一條線 縱座標遞增,橫座標最大 { $result[$j+1][$maxRight] = $k++; } for($j=$maxRight-1;$j>=$i; $j--)          //構造下邊一條線 縱座標最大,橫座標遞減 { if($result[$maxBottom][$j]) break; $result[$maxBottom][$j] = $k++; } for($j=$maxBottom-1;$j>$i;$j--)           //構造左邊一條線 縱座標遞減,橫座標最小 { if($result[$j][$i]) break; $result[$j][$i] = $k++; } } return $result; }
該函式由偉大的詩人chenqionghe撰寫, 呼叫時傳數兩個引數行數和列數,即可返回螺旋陣列, 好人做到底吧,再定義一個以表格輸出的方式,列印該螺旋陣列直觀一點,方法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /** * 以table格式輸出陣列 * @param $result 螺旋陣列 * @param $row 行數 * @param $col 列數 */ function printArray($result,$row,$col) { echo '<table border=1 style="width:500px;">'; for($i=0;$i<$row;$i++) { echo '<tr>'; for($j=0;$j<$col;$j++) { echo '<td style="padding: 50px;">'.$result[$i][$j].'</td>'; } echo '<tr>'; } echo '</table>'; }
然後,我們來呼叫一下上面的方法,生成一個5*5的螺旋陣列
1 2 3 4 $row = 5; $col = 5; $arr = rotationSort($row,$col); printArray($arr,$row,$col);
執行結果如下 我了個乖乖,只能用perfect來形容。 現在,我們回到那個輸出25個字母A-Y的問題,解決這個問題更簡單了,就是以0-到24為鍵,A-Y為值,定義陣列就行了,如下:
1 $arr = array('A','B','C','D','E','F', 'G', 'H', 'I', 'J', 'K', 'L', 'N', 'M', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',);
輸出的時候稍做改動即能輸出A-Y的螺旋陣列,完整程式碼如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <?php /** * 根據傳入的行數和列數生成螺旋陣列 * @author chenqionghe * @param int $row 行數 * @param int $col 列數 * @return array */ function rotationSort($row=5,$col=5) { $k=1; $result = array(); $small = $col < $row ? $col : $row; $count = ceil($small / 2); for($i=0; $i<$count; $i++) { $maxRight = $col-1-$i;//右邊最大座標 $maxBottom = $row -1 -$i;//下面最大座標 for($j=$i; $j<=$maxRight; $j++)           //構造上邊一條線  縱座標最小,橫座標遞增 { $result[$i][$j] = $k++; } for($j=$i; $j<$maxBottom; $j++)           //構造右邊一條線 縱座標遞增,橫座標最大 { $result[$j+1][$maxRight] = $k++; } for($j=$maxRight-1;$j>=$i; $j--)          //構造下邊一條線 縱座標最大,橫座標遞減 { if($result[$maxBottom][$j]) break; $result[$maxBottom][$j] = $k++; } for($j=$maxBottom-1;$j>$i;$j--)           //構造左邊一條線 縱座標遞減,橫座標最小 { if($result[$j][$i]) break; $result[$j][$i] = $k++; } } return $result; } /** * 以table格式輸出陣列 * @param $rotationArr 要輸出的內容 * @param $result 螺旋陣列 * @param $row 行數 * @param $col 列數 */ function printArray($rotationArr,$result,$row,$col) { echo '<table border=1 style="width:500px;">'; for($i=0;$i<$row;$i++) { echo '<tr>'; for($j=0;$j<$col;$j++) { //echo '<td style="padding: 50px;">'.$result[$i][$j].'</td>'; echo '<td style="padding: 50px;">'.$rotationArr[$result[$i][$j]-1].'</td>'; } echo '<tr>'; } echo '</table>'; } $arr = array('A','B','C','D','E','F', 'G', 'H', 'I', 'J', 'K', 'L', 'N', 'M', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',); $row = 5; $col = 5; $rotationArr = rotationSort($row,$col); printArray($arr,$rotationArr,$row,$col);
最終輸出結果如下:

轉載地址:http://www.cnblogs.com/chenqionghe/p/4765802.html