记录一下自己对蛇形矩阵的实现

2016-04-04  本文已影响0人  iSakura

腾讯校招笔试模拟题遇到蛇形矩阵实现的编程题
记录一下自己的实现代码

 * 根据给出的 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>';
    }
}`
上一篇 下一篇

猜你喜欢

热点阅读