从内到外的螺旋遍历 :蛇形矩阵

给定一个包含 n x n 个元素的矩阵,请按照逆时针螺旋顺序,返回矩阵中的所有元素。

(蛇形矩阵:小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字)

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [5,6,3,2,1,4,7,8,9]

承接上一道题,从方阵中心逆时针遍历,依然使用x1y1  x2y2限制坐标法,完成整个遍历。不过x1y1 x2y2这回是分别向外扩散,一个向左上扩散, 一个向右下扩散。

                                               从内到外的螺旋遍历 :蛇形矩阵_第1张图片

注意遍历的起点单独插入r,每次遍历先是right top left down 与之前的螺旋遍历有点区别。

   vectorr;
        if(matrix.empty())return r;
        int m=matrix.size();
        int n=matrix[0].size();
        
        int x1,x2,y1,y2;
        x1=y1=n/2-1;
        x2=y2=n/2+1;
        r.push_back(matrix[n/2][n/2]);
        while(x1>=0&&y1>=0)
        {
            
              for(int x=x2-1;x>=x1;x--)
            {
                r.push_back(matrix[x][y2]);
            }
            
             for(int y=y2-1;y>=y1;y--)
            {
                r.push_back(matrix[x1][y]);
            }
            
            
            for(int x=x1+1;x<=x2;x++)
            {
                r.push_back(matrix[x][y1]);
            }
            
            
            //top,从左到右
            for(int y=y1+1;y<=y2;y++)
            {
                r.push_back(matrix[x2][y]);
            }
                        
                                   
            
            x1--;
            x2++;
            y1--;
            y2++;
        }
        return r;

 

你可能感兴趣的:(算法)