leetcode || 59、 Spiral Matrix II

problem:

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

Hide Tags
  Array
题意:指定方阵的阶数,从1开始递增 顺时针螺旋填充该方阵,输出填充好的方阵

thinking:

(1)属于全局遍历的问题,采用DFS方法,从外层到里层,顺时针螺旋一圈为一个深度,终止条件是:(1)n为偶数,2*dep==n(2)n为奇数,2*dep+1==n

(2)DFS的难点在于,怎么样计算DFS的二维方阵的坐标,我的做法是,每一个层次(dep)遍历,分4个方向,分别对应矩阵的4条螺旋边。

code:

class Solution {

public:
    vector<vector<int> > generateMatrix(int n) {
        vector<int> tmp(n,0);
        vector<vector<int> > ret(n,tmp); //二维vector 初始化大小技巧
        int start=1;           //从1开始填充   
        dfs(0,n,start,ret);   
        return ret;
        
    }
protected:
    void dfs(int dep, int n, int &start,vector<vector<int> > &ret)
    {
        if(2*dep==n)   //n为偶数
            return;
        if(2*dep+1==n)  //n为奇数,填充方阵的中心
        {
            int x=n/2;
            ret[x][x]=start;
            return;
        }
        for(int h1=dep,v1=dep;v1<=n-dep-1;v1++) //最上一条横边,从左往右
        {
            ret[h1][v1]=start;
            start++;
        }
        for(int v2=n-dep-1,h2=dep+1;h2<=n-dep-1;h2++) //最右一条侧边,从上到下
        {
            ret[h2][v2]=start;
            start++;
        }
        for(int h3=n-dep-1,v3=n-dep-2;v3>=dep;v3--)  //最下一条横边,从右往左
        {
            ret[h3][v3]=start;
            start++;
        }
        for(int v4=dep,h4=n-dep-2;h4>=dep+1;h4--) //最左一条侧边,从下往上
        {
            ret[h4][v4]=start;
            start++;
        }

        dfs(dep+1,n,start,ret);     //dfs遍历
    }
};


你可能感兴趣的:(LeetCode,算法,Matrix,DFS)