Spiral Matrix in C++


Suppose we have a matrix and we have to print the matrix elements in a spiral way. At first starting from the first row, print the whole content and then follow the last column to print, then the last row, and so on, thus it prints the elements in a spiral fashion. So if the matrix is like −

123456
789101112
131415161718

Then the output will be like [1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16]

To solve this, we will follow these steps −

  • currRow := 0 and currCol := 0

  • while currRow and currCol are in the matrix range

    • for i in range currCol and n-1,

      • display mat[currRow, i]

    • increase currRow by 1

    • for i in range currRow and m-1, do

      • display mat[i, n-1]

    • decrease n by 1

    • if currRow < m, then

      • for i := n-1 down to currCol, do

        • display mat[m-1, i]

      • decrease m by 1

      • if currCol < n, then

        • for i := m-1 down to currRow, do

          • display mat[i, currCol]

        • increase currCol by 1

Example(C++)

Let us see the following implementation to get a better understanding −

 Live Demo

#include <iostream>
#define ROW 3
#define COL 6
using namespace std;
int array[ROW][COL] = {{1, 2, 3, 4, 5, 6},
   {7, 8, 9, 10, 11, 12},
   {13, 14, 15, 16, 17, 18}};
void dispSpiral(int m, int n){
   int i, currRow = 0, currCol = 0;
   while (currRow < ROW && currCol < COL){
      for (i = currCol; i < n; i++){ //print the first row normally
      cout << array[currRow][i]<<" ";
   }
   currRow++; //point to next row
   for (i = currRow; i < m; ++i){ //Print the last column
      cout << array[i][n-1]<<" ";
   }
   n--; //set the n-1th column is current last column
   if ( currRow < m){ //when currRow is in the range, print the last row
      for (i = n-1; i >= currCol; --i){
         cout << array[m-1][i]<<" ";
      }
      m--; //decrease the row range
   }
   if (currCol < n){ //when currCol is in the range, print the fist column
      for (i = m-1; i >= currRow; --i){
         cout << array[i][currCol]<<" ";
      }
      currCol++;
      }
   }
}
int main(){
   dispSpiral(ROW, COL);
}

Input

[[1,2,3,4,5,6]
[7,8,9,10,11,12]
[13,14,15,16,17,18]]

Output

1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11 15 16

Updated on: 27-Apr-2020

4K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements