Given a 2D array, print it in spiral form. See the following examples.
Examples:
Input: 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Output: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
Explanation: The output is matrix in spiral format.
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
Explanation :The output is matrix in spiral format.

Method 1: This is a simple method to solve the following problem.
Approach: The problem can be solved by dividing the matrix into loops or squares or boundaries. It can be seen that the elements of the outer loop are printed first in a clockwise manner then the elements of the inner loop is printed. So printing the elements of a loop can be solved using four loops which prints all the elements. Every ‘for’ loop defines a single direction movement along with the matrix. The first for loop represents the movement from left to right, whereas the second crawl represents the movement from top to bottom, the third represents the movement from the right to left, and the fourth represents the movement from bottom to up.
- Algorithm:
- Create and initialize variables k – starting row index, m – ending row index, l – starting column index, n – ending column index
- Run a loop until all the squares of loops are printed.
- In each outer loop traversal print the elements of a square in a clockwise manner.
- Print the top row, i.e. Print the elements of the kth row from column index l to n, and increase the count of k.
- Print the right column, i.e. Print the last column or n-1th column from row index k to m and decrease the count of n.
- Print the bottom row, i.e. if k < m, then print the elements of m-1th row from column n-1 to l and decrease the count of m
- Print the left column, i.e. if l < n, then print the elements of lth column from m-1th row to k and increase the count of l.
Below is the implementation of the above algorithm:
C++
// C++ Program to print a matrix spirally#include <bits/stdc++.h>using namespace std;#define R 3#define C 6void spiralPrint(int m, int n, int a[R][C]){ int i, k = 0, l = 0; /* k - starting row index m - ending row index l - starting column index n - ending column index i - iterator */ while (k < m && l < n) { /* Print the first row from the remaining rows */ for (i = l; i < n; ++i) { cout << a[k][i] << " "; } k++; /* Print the last column from the remaining columns */ for (i = k; i < m; ++i) { cout << a[i][n - 1] << " "; } n--; /* Print the last row from the remaining rows */ if (k < m) { for (i = n - 1; i >= l; --i) { cout << a[m - 1][i] << " "; } m--; } /* Print the first column from the remaining columns */ if (l < n) { for (i = m - 1; i >= k; --i) { cout << a[i][l] << " "; } l++; } }}/* Driver Code */int main(){ int a[R][C] = { { 1, 2, 3, 4, 5, 6 }, { 7, 8, 9, 10, 11, 12 }, { 13, 14, 15, 16, 17, 18 } }; // Function Call spiralPrint(R, C, a); return 0;}// This is code is contributed by rathbhupendra |
C
// C program to print the array in a// spiral form#include <stdio.h>#define R 3#define C 6void spiralPrint(int m, int n, int a[R][C]){ int i, k = 0, l = 0; /* k - starting row index m - ending row index l - starting column index n - ending column index i - iterator */ while (k < m && l < n) { /* Print the first row from the remaining rows */ for (i = l; i < n; ++i) { printf("%d ", a[k][i]); } k++; /* Print the last column from the remaining columns */ for (i = k; i < m; ++i) { printf("%d ", a[i][n - 1]); } n--; /* Print the last row from the remaining rows */ if (k < m) { for (i = n - 1; i >= l; --i) { printf("%d ", a[m - 1][i]); } m--; } /* Print the first column from the remaining columns */ if (l < n) { for (i = m - 1; i >= k; --i) { printf("%d ", a[i][l]); } l++; } }}/* Driver Code */int main(){ int a[R][C] = { { 1, 2, 3, 4, 5, 6 }, { 7, 8, 9, 10, 11, 12 }, { 13, 14, 15, 16, 17, 18 } }; // Function Call spiralPrint(R, C, a); return 0;} |
Java
// Java program to print a given matrix in spiral formimport java.io.*;class GFG { // Function print matrix in spiral form static void spiralPrint(int m, int n, int a[][]) { int i, k = 0, l = 0; /* k - starting row index m - ending row index l - starting column index n - ending column index i - iterator */ while (k < m && l < n) { // Print the first row from the remaining rows for (i = l; i < n; ++i) { System.out.print(a[k][i] + " "); } k++; // Print the last column from the remaining // columns for (i = k; i < m; ++i) { System.out.print(a[i][n - 1] + " "); } n--; // Print the last row from the remaining rows */ if (k < m) { for (i = n - 1; i >= l; --i) { System.out.print(a[m - 1][i] + " "); } m--; } // Print the first column from the remaining // columns */ if (l < n) { for (i = m - 1; i >= k; --i) { System.out.print(a[i][l] + " "); } l++; } } } // Driver Code public static void main(String[] args) { int R = 3; int C = 6; int a[][] = { { 1, 2, 3, 4, 5, 6 }, { 7, 8, 9, 10, 11, 12 }, { 13, 14, 15, 16, 17, 18 } }; // Function Call spiralPrint(R, C, a); }}// Contributed by Pramod Kumar |
Python3
# Python3 program to print# given matrix in spiral formdef spiralPrint(m, n, a): k = 0 l = 0 ''' k - starting row index m - ending row index l - starting column index n - ending column index i - iterator ''' while (k < m and l < n): # Print the first row from # the remaining rows for i in range(l, n): print(a[k][i], end=" ") k += 1 # Print the last column from # the remaining columns for i in range(k, m): print(a[i][n - 1], end=" ") n -= 1 # Print the last row from # the remaining rows if (k < m): for i in range(n - 1, (l - 1), -1): print(a[m - 1][i], end=" ") m -= 1 # Print the first column from # the remaining columns if (l < n): for i in range(m - 1, k - 1, -1): print(a[i][l], end=" ") l += 1# Driver Codea = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]]R = 3C = 6# Function CallspiralPrint(R, C, a)# This code is contributed by Nikita Tiwari. |
C#
// C# program to print a given// matrix in spiral formusing System;class GFG { // Function print matrix in spiral form static void spiralPrint(int m, int n, int[, ] a) { int i, k = 0, l = 0; /* k - starting row index m - ending row index l - starting column index n - ending column index i - iterator */ while (k < m && l < n) { // Print the first row // from the remaining rows for (i = l; i < n; ++i) { Console.Write(a[k, i] + " "); } k++; // Print the last column from the // remaining columns for (i = k; i < m; ++i) { Console.Write(a[i, n - 1] + " "); } n--; // Print the last row from // the remaining rows if (k < m) { for (i = n - 1; i >= l; --i) { Console.Write(a[m - 1, i] + " "); } m--; } // Print the first column from // the remaining columns if (l < n) { for (i = m - 1; i >= k; --i) { Console.Write(a[i, l] + " "); } l++; } } } // Driver Code public static void Main() { int R = 3; int C = 6; int[, ] a = { { 1, 2, 3, 4, 5, 6 }, { 7, 8, 9, 10, 11, 12 }, { 13, 14, 15, 16, 17, 18 } }; // Function Call spiralPrint(R, C, a); }}// This code is contributed by Sam007 |
PHP
<?php // PHP program to print a given// matrix in spiral form$R = 3;$C = 6;function spiralPrint($m, $n, &$a){ $k = 0; $l = 0; /* $k - starting row index $m - ending row index $l - starting column index $n - ending column index $i - iterator */ while ($k < $m && $l < $n) { /* Print the first row from the remaining rows */ for ($i = $l; $i < $n; ++$i) { echo $a[$k][$i] . " "; } $k++; /* Print the last column from the remaining columns */ for ($i = $k; $i < $m; ++$i) { echo $a[$i][$n - 1] . " "; } $n--; /* Print the last row from the remaining rows */ if ($k < $m) { for ($i = $n - 1; $i >= $l; --$i) { echo $a[$m - 1][$i] . " "; } $m--; } /* Print the first column from the remaining columns */ if ($l < $n) { for ($i = $m - 1; $i >= $k; --$i) { echo $a[$i][$l] . " "; } $l++; } }}// Driver code$a = array(array(1, 2, 3, 4, 5, 6), array(7, 8, 9, 10, 11, 12), array(13, 14, 15, 16, 17, 18));// Function CallspiralPrint($R, $C, $a);// This code is contributed// by ChitraNayal?> |
1 2 3 4 5 6 12 18 17 16 15 14 13 7 8 9 10 11
Complexity Analysis:
- Time Complexity: O(m*n).
To traverse the matrix O(m*n) time is required. - Space Complexity: O(1).
No extra space is required.
Method 2: (Recursive Approach)
Approach: The above problem can be solved by printing the boundary of the Matrix recursively. In each recursive call, we decrease the dimensions of the matrix. The idea of printing the boundary or loops is the same.
- Algorithm:
- create a recursive function that takes a matrix and some variables (k – starting row index, m – ending row index, l – starting column index, n – ending column index) as parameters
- Check the base cases (stating index is less than or equal to ending index) and print the boundary elements in clockwise manner
- Print the top row, i.e. Print the elements of kth row from column index l to n, and increase the count of k.
- Print the right column, i.e. Print the last column or n-1th column from row index k to m and decrease the count of n.
- Print the bottom row, i.e. if k > m, then print the elements of m-1th row from column n-1 to l and decrease the count of m
- Print the left column, i.e. if l < n, then print the elements of lth column from m-1th row to k and increase the count of l.
- Call the function recursively with the values of starting and ending indices of rows and columns.
Below is the implementation of the above algorithm:
C++
// C++. program for the above approach#include <iostream>using namespace std;#define R 4#define C 4// Function for printing matrix in spiral// form i, j: Start index of matrix, row// and column respectively m, n: End index// of matrix row and column respectivelyvoid print(int arr[R][C], int i, int j, int m, int n){ // If i or j lies outside the matrix if (i >= m or j >= n) return; // Print First Row for (int p = i; p < n; p++) cout << arr[i][p] << " "; // Print Last Column for (int p = i + 1; p < m; p++) cout << arr[p][n - 1] << " "; // Print Last Row, if Last and // First Row are not same if ((m - 1) != i) for (int p = n - 2; p >= j; p--) cout << arr[m - 1][p] << " "; // Print First Column, if Last and // First Column are not same if ((n - 1) != j) for (int p = m - 2; p > i; p--) cout << arr[p][j] << " "; print(arr, i + 1, j + 1, m - 1, n - 1);}// Driver Codeint main(){ int a[R][C] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } }; // Function Call print(a, 0, 0, R, C); return 0;}// This Code is contributed by Ankur Goel |
Java
// Java program for the above approachimport java.util.*;class GFG { static int R = 4; static int C = 4; // Function for printing matrix in spiral // form i, j: Start index of matrix, row // and column respectively m, n: End index // of matrix row and column respectively static void print(int arr[][], int i, int j, int m, int n) { // If i or j lies outside the matrix if (i >= m || j >= n) { return; } // Print First Row for (int p = i; p < n; p++) { System.out.print(arr[i][p] + " "); } // Print Last Column for (int p = i + 1; p < m; p++) { System.out.print(arr[p][n - 1] + " "); } // Print Last Row, if Last and // First Row are not same if ((m - 1) != i) { for (int p = n - 2; p >= j; p--) { System.out.print(arr[m - 1][p] + " "); } } // Print First Column, if Last and // First Column are not same if ((n - 1) != j) { for (int p = m - 2; p > i; p--) { System.out.print(arr[p][j] + " "); } } print(arr, i + 1, j + 1, m - 1, n - 1); } // Driver Code public static void main(String[] args) { int a[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } }; // Function Call print(a, 0, 0, R, C); }}// This code is contributed by 29AjayKumar |
Python3
# Python3 program for the above approach# Function for printing matrix in spiral# form i, j: Start index of matrix, row# and column respectively m, n: End index# of matrix row and column respectivelydef printdata(arr, i, j, m, n): # If i or j lies outside the matrix if (i >= m or j >= n): return # Print First Row for p in range(i, n): print(arr[i][p], end=" ") # Print Last Column for p in range(i + 1, m): print(arr[p][n - 1], end=" ") # Print Last Row, if Last and # First Row are not same if ((m - 1) != i): for p in range(n - 2, j - 1, -1): print(arr[m - 1][p], end=" ") # Print First Column, if Last and # First Column are not same if ((n - 1) != j): for p in range(m - 2, i, -1): print(arr[p][j], end=" ") printdata(arr, i + 1, j + 1, m - 1, n - 1)# Driver codeR = 4C = 4arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]# Function Callprintdata(arr, 0, 0, R, C)# This code is contributed by avsadityavardhan |
C#
// C# program for the above approachusing System;class GFG { static int R = 4; static int C = 4; // Function for printing matrix in spiral // form i, j: Start index of matrix, row // and column respectively m, n: End index // of matrix row and column respectively static void print(int[, ] arr, int i, int j, int m, int n) { // If i or j lies outside the matrix if (i >= m || j >= n) { return; } // Print First Row for (int p = i; p < n; p++) { Console.Write(arr[i, p] + " "); } // Print Last Column for (int p = i + 1; p < m; p++) { Console.Write(arr[p, n - 1] + " "); } // Print Last Row, if Last and // First Row are not same if ((m - 1) != i) { for (int p = n - 2; p >= j; p--) { Console.Write(arr[m - 1, p] + " "); } } // Print First Column, if Last and // First Column are not same if ((n - 1) != j) { for (int p = m - 2; p > i; p--) { Console.Write(arr[p, j] + " "); } } print(arr, i + 1, j + 1, m - 1, n - 1); } // Driver Code public static void Main(String[] args) { int[, ] a = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } }; // Function Call print(a, 0, 0, R, C); }}// This code is contributed by Princi Singh |
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
Complexity Analysis:
- Time Complexity: O(m*n).
To traverse the matrix O(m*n) time is required. - Space Complexity: O(1).
No extra space is required.
https://www.youtube.com/watch?v=qEZoUVOqOs8
Please write comments if you find the above code incorrect, or find other ways to solve the same problem.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Print a given matrix in reverse spiral form
- Print a given matrix in counter-clock wise spiral form
- Print a given matrix in spiral form using direction tracking method
- Print K'th element in spiral form of matrix
- Print a matrix in a spiral form starting from a point
- Print matrix elements diagonally in spiral form
- Form a Spiral Matrix from the given Array
- Convert given Matrix into sorted Spiral Matrix
- Circular Matrix (Construct a matrix with numbers 1 to m*n in spiral way)
- Print n x n spiral matrix using O(1) extra space
- Level order traversal in spiral form
- Level order traversal in spiral form using stack and multimap
- Find the sum of the diagonal elements of the given N X N spiral matrix
- Sum of both diagonals of a spiral odd-order square matrix
- Program to print Spiral Pattern
- Print a given matrix in zigzag form
- Print matrix in antispiral form
- Program to Print Matrix in Z form
- Print a matrix in Reverse Wave Form
- Convert a Binary Tree into Doubly Linked List in spiral fashion

