腾讯校招笔试模拟题遇到蛇形矩阵实现的编程题
记录一下自己的实现代码
* 根据给出的 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>';
}
}`