Tuesday, August 11, 2020

885. Spiral Matrix III -----------M

 On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east.

Here, the north-west corner of the grid is at the first row and column, and the south-east corner of the grid is at the last row and column.

Now, we walk in a clockwise spiral shape to visit every position in this grid. 

Whenever we would move outside the boundary of the grid, we continue our walk outside the grid (but may return to the grid boundary later.) 

Eventually, we reach all R * C spaces of the grid.

Return a list of coordinates representing the positions of the grid in the order they were visited.

 

Example 1:

Input: R = 1, C = 4, r0 = 0, c0 = 0
Output: [[0,0],[0,1],[0,2],[0,3]]


 

Example 2:

Input: R = 5, C = 6, r0 = 1, c0 = 4
Output: [[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]


 

Note:

  1. 1 <= R <= 100
  2. 1 <= C <= 100
  3. 0 <= r0 < R
  4. 0 <= c0 < C



A:

没啥好办法,就是一个走四条边

class Solution {
public:
    vector<vector<int>> spiralMatrixIII(int R, int C, int r0, int c0) {
        vector<vector<int>> res;
        res.push_back(vector<int>{r0,c0});
        int len = 0;
        while(res.size()<R*C){
            len ++;            
            // go down along the right column
            for(int row =  r0-len + 1; row < r0+len;row++)
                if(row >=0 && row < R && c0+len <C)
                    res.push_back(vector<int>{row, c0 + len});
            
            // go at bottom from right to left
            for(int col = c0+len;col >c0 - len;col--)
                if( r0+len < R && col >=0 && col <C)
                    res.push_back(vector<int>{r0+len, col});
            
            // go at left, from bottom to up
            for(int row = r0+len; row > r0-len;row--)
                if(row >=0 && row < R && c0-len >=0)
                    res.push_back(vector<int>{row, c0-len});
            
            // go at top row, from left to right
            for(int col = c0-len; col<=c0+len;col++)
                if(r0-len >=0 && col >=0 && col <C)
                    res.push_back(vector<int>{r0-len, col});
        }
        return res;
    }
};


Mistakes:

第一条边从上往下走的时候,

// go down along the right column
            for(int row =  r0-len + 1; row < r0+len;row++)
写成了
// go down along the right column
            for(int row =  r0-len - 1; row < r0+len;row++)
当时真是不严谨,没有考虑好往下走, row是加一的

No comments:

Post a Comment