騰訊校招筆試模擬題遇到蛇形矩陣實現的編程題
記錄一下自己的實現代碼
* 根據給出的 N 輸出一個 N*N 的蛇形矩陣
* 行分為 1.第一行 2.存在自左向右自然遞增的行 3.存在自右向左自然遞增的行 三種情況
* 列分為 1.左側相比上一行同位減一的列 2.右側相比上一行同位加一的列 3.中間自然遞增遞減的列 三種情況
* 判斷出目前的位置屬于哪種情況就知道怎么去計算當前位置的數字了
* @param integer $n N
*/
public function sxjz( $n )
{
// 存放矩陣數據的變量
$result = array();
// 行 2 列 1 區域長度
$leftWidth = -1;
// 行 2 列 2 區域長度
$rightWidth = 0;
// 行 3 列 1、2 區域長度
$paddingWidth = $n - 1;
for ( $i = 0; $i < $n; $i++ )
{
for ( $j = 0; $j < $n; $j++ )
{
// 第一行直接賦值
if ( $i === 0 )
$result[$i][$j] = $j + 1;
// 行 2 情況
else if ( $i < ( $n%2 === 0 ? $n/2 : ($n+1)/2 ) )
{
$tempAutoAddLen = $n - $leftWidth - $rightWidth;
$tempAutoAddStart = $leftWidth;
// 行 2 列 1 情況
if ( $j < $leftWidth )
$result[$i][$j] = $result[$i-1][$j] - 1;
// 行 2 列 2 情況
else if ( $j >= $leftWidth + $tempAutoAddLen )
$result[$i][$j] = $result[$i-1][$j] + 1;
// 行 2 列 3 情況
else
$result[$i][$j] = $result[$i-1][$j] + 4*$tempAutoAddLen - 1;
}
// 行 3 情況
else if ( $i >= ( $n%2 === 0 ? $n/2 : ($n+1)/2 ) )
{
$tempAutoAddLen = $n - 2*$paddingWidth;
// 行 3 列 1 情況
if ( $j < $paddingWidth )
$result[$i][$j] = $result[$i-1][$j] - 1;
// 行 3 列 2 情況
else if ( $j >= $paddingWidth + $tempAutoAddLen )
$result[$i][$j] = $result[$i-1][$j] + 1;
// 行 3 列 3 情況
else
{
if ( $n - $i - 1 === 0 )
$result[$i][$j] = 3*$tempAutoAddLen + $paddingWidth - $j - 2;
else
$result[$i][$j] = $result[$n-$i-1][$n-$i-2] + 3*$tempAutoAddLen + $paddingWidth - $j - 2;
}
}
echo $result[$i][$j] . "\t";
}
$leftWidth++;
$rightWidth++;
$paddingWidth--;
echo '<br>';
}
}`