PHP實現螺旋矩陣(螺旋陣列)
阿新 • • 發佈:2019-02-06
今天碰到一個比較有意思的問題, 就是把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 |
1 | 2 | 3 | 4 | 5 |
12 | 13 | 14 | 15 | 6 |
11 | 10 | 9 | 8 | 7 |
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 ;
}
|
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>' ;
}
|
1 2 3 4 |
$row
= 5;
$col
= 5;
$arr
= rotationSort( $row , $col );
printArray( $arr , $row , $col );
|
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' ,);
|
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