# Print a matrix in spiral order

Given a `nxm` matrix , print the matrix in spiral order.

### Test Case

#### Example 1

Sample Input:

```[1 2 3 4 5 6]
[16 17 18 19 6]
[15 24 25 20 7]
[14 23 22 21 8]
[13 12 11 10 9]```

Expected Output: `1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25`

### Solution

To solve this problem, we will define 4 variables

1. `left`: This is the index of the leftmost column that needs to be printed. Its initial value will be 0
2. `right`: This is the index of the rightmost column that needs to be printed. Its initial value will be `m-1`, where `m` is the number of columns in the matrix.
3. `top`. This is the index of the topmost row that needs to be printed. Its initial value will be `0`.
4. `bottom`: This is the index of the bottommost row which needs to be printed. Its initial value will be `n-1`, where `n` is the number of rows in the matrix.

Initially, the values of `left`, `right`, `top` and `bottom` would be as shown in the diagram below:

After that we will start by writing 4 loops for printing the topmost row, rightmost column, bottom-most row and leftmost column respectively.

After every for loop we will change the value of the corresponding variable (`left`/`right`/`top`/`bottom`). As soon as we see that there are no more elements left to print, we will exit the loop

See the below GIF to understand it better

#### Implementation

Implementation of the above solution to print matrix in spiral order is given below:

```#include <bits/stdc++.h>
using namespace std;

int main() {
vector<vector<int>> vec = { { 1, 2, 3, 4, 5 }, { 16, 17, 18, 19, 6 }, {15, 24, 25, 20, 7 }, { 14, 23, 22, 21, 8}, {13, 12, 11, 10, 9 }};

// The boundaries for the current iteration
int top = 0, bottom = vec.size() - 1, left = 0, right = vec[0].size() - 1;

while (top <= bottom && left <= right) {

// Print Top Row of the matrix
for(int i = left; i <= right; i++) {
cout << vec[top][i] << " ";
}
top++;

// Print right side
for(int i = top; i <= bottom; i++) {
cout << vec[i][right] << " ";
}
right--;

// Print Bottom Row
for(int i = right; i >= left; i--) {
cout << vec[bottom][i] << " ";
}

bottom--;

// Print left row
for(int i = bottom; i >= top; i--) {
cout << vec[i][left] << " ";
}
left++;
}

cout << "\n";
}
```
Scroll to Top
[gravityforms id="5" description="false" titla="false" ajax="true"]