1.顺时针螺旋形式读取矩阵的值

一.考虑解决方案

    首先是移动方向分别是右,下,左,上,一般处理矩阵问题都是用一个向量表示,很自然的可以用以下表达方式来处理vector<vector<int>> direction={{0,1},{1,0},{0,-1},{-1,0}},接下来有一个重要的规律要能发现。

水平移动:
向右3次
向左2次
向右1次
垂直移动:
向下2次
向上1次

起始位置定再(0,-1)的位置。从上面的规律可以看出如果是一个m*n的矩阵,那么水平移动从n开始,垂直移动从m-1开始。所以一开始移动的时候我们首先要定位是水平还是垂直移动。定义int select[2]={n,m-1},接下来就是代码具体实现。

 vector<int> spiralOrder(vector<vector<int> > &matrix) 
    {
        /*matrix 为输入矩阵*/
        vector<int> result;//结果
        int m=matrix.size();//行
        int n=matrix[0].size();//列
        if(!m||!n) return result;//检测是否为空
        vector<vector<int>> direction={{0,1},{1,0},{0,-1},{-1,0}};//存方向的数组
        int select[2]={n,m-1};//select[0]表示水平移动次数
        int cur[2]={0,-1};//当前移动点的坐标
        int dir=0;//当前方向0代表向右,1代表向下,2代表向左,3代表向上
        while(select[dir%2])
        {
            int steps=select[dir%2];
            for(int i=0;i<steps;i++)//在dir方向移动的次数
            {
                cur[0]+=direction[dir][0];
                cur[1]+=direction[dir][1];
                result.push_back(matrix[cur[0]][cur[1]]);
            }
            select[dir%2]--;//根据规律水平或者竖直方向减一
            dir=(dir+1)%4;//按照顺序变换方向			
        }
        return result;
    }




猜你喜欢

转载自blog.csdn.net/feng__shuai/article/details/80929882