<p>You start at the cell <code>(rStart, cStart)</code> of an <code>rows x cols</code> grid facing east. The northwest corner is at the first row and column in the grid, and the southeast corner is at the last row and column.</p>

<p>You will walk in a clockwise spiral shape to visit every position in this grid. Whenever you move outside the grid&#39;s boundary, we continue our walk outside the grid (but may return to the grid boundary later.). Eventually, we reach all <code>rows * cols</code> spaces of the grid.</p>

<p>Return <em>an array of coordinates representing the positions of the grid in the order you visited them</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://s3-lc-upload.s3.amazonaws.com/uploads/2018/08/24/example_1.png" style="width: 174px; height: 99px;" />
<pre>
<strong>Input:</strong> rows = 1, cols = 4, rStart = 0, cStart = 0
<strong>Output:</strong> [[0,0],[0,1],[0,2],[0,3]]
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://s3-lc-upload.s3.amazonaws.com/uploads/2018/08/24/example_2.png" style="width: 202px; height: 142px;" />
<pre>
<strong>Input:</strong> rows = 5, cols = 6, rStart = 1, cStart = 4
<strong>Output:</strong> [[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]]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= rows, cols &lt;= 100</code></li>
	<li><code>0 &lt;= rStart &lt; rows</code></li>
	<li><code>0 &lt;= cStart &lt; cols</code></li>
</ul>

class Matrix{
    public :
        int i_lo;
        int j_lo;
        int i_max;
        int j_max;
        int i;
        int j;
        int idx = 0;
        vector<vector<int>> val_mat;
        int steps = 1;
        void go_right(){
            int k = 1;
            while(k <= steps && idx < val_mat.size()){
                if(i <= i_max && i >= i_lo && j >= j_lo && j <= j_max){
                val_mat[idx][0] = i;
                val_mat[idx][1] = j;
                idx++;
                }
                
                k++; 
                j++;
            }
            j--;
            i++;
        }
        
        void go_down(){
            int k = 1;
            while(k <= steps && idx < val_mat.size()){
                if(i <= i_max && i >= i_lo && j >= j_lo && j <= j_max){
                val_mat[idx][0] = i;
                val_mat[idx][1] = j;
                idx++; 
                }
               
                k++; 
                i++;
            }
            i--;
            j--;
        }
        
        void go_up(){
            int k = 1;
            while(k <= steps && idx < val_mat.size()){
                if(i <= i_max && i >= i_lo && j >= j_lo && j <= j_max){
                val_mat[idx][0] = i;
                val_mat[idx][1] = j;
                idx++;
                }
                
                k++; 
                i--;
            }
            i++;
            j++;

        }
        
        void go_left(){
            int k = 1;
            while(k <= steps && idx < val_mat.size()){
                if(i <= i_max && i >= i_lo && j >= j_lo && j <= j_max){
                val_mat[idx][0] = i;
                val_mat[idx][1] = j;
                idx++;
                }
                
                k++; 
                j--;
            }
            j++;
            i--;
            
        }
        void solve(){
        val_mat[0][0] = i;
        val_mat[0][1] = j;
        idx++;
        j++;
          while(idx < val_mat.size()){
             go_right();
             go_down();
             steps++;
             go_left();
             go_up();
             steps++;
          }
          
        }
};      


class Solution {
public:
    vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
    int n = rows*cols;
    vector<vector<int>> arr(n, vector<int>(2,0));

    Matrix m;
    m.i_lo = 0;
    m.j_lo = 0;
    m.i_max = rows-1;
    m.j_max = cols-1;
    m.i = rStart;
    m.j = cStart;
    m.val_mat = arr;

    m.solve();

    arr = m.val_mat;

    return arr; 

    
    }
};
15100