Print a given matrix in spiral form - GeeksforGeeks

27 Apr, 2022
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 11Explanation :The output is matrix in spiral format.
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
Best Optimized Method 1: (Simulation Approach)
Intuition:
Draw the path that the spiral makes. We know that the path should turn clockwise whenever it would go out of bounds or into a cell that was previously visited.
Algorithm:
Let the array have R rows and C columns. seen[r] denotes that the cell on the r-th row and c-th column was previously visited. Our current position is (r, c), facing direction di, and we want to visit R x C total cells.
As we move through the matrix, our candidate’s next position is (cr, cc). If the candidate is in the bounds of the matrix and unseen, then it becomes our next position; otherwise, our next position is the one after performing a clockwise turn.
C++
Java
Python3
C#
Javascript
#include <bits/stdc++.h>using namespace std; vector<int> spiralOrder(vector<vector<int>> &matrix){    vector<int> ans;     if (matrix.size() == 0)        return ans;     int R = matrix.size(), C = matrix[0].size();    vector<vector<bool>> seen(R, vector<bool>(C, false));    int dr[] = {0, 1, 0, -1};    int dc[] = {1, 0, -1, 0};    int r = 0, c = 0, di = 0;     // Iterate from 0 to R * C - 1    for (int i = 0; i < R * C; i++)    {        ans.push_back(matrix[r]);        seen[r] = true;        int cr = r + dr[di];        int cc = c + dc[di];         if (0 <= cr && cr < R && 0 <= cc && cc < C && !seen[cr][cc])        {            r = cr;            c = cc;        }        else        {            di = (di + 1) % 4;            r += dr[di];            c += dc[di];        }    }    return ans;} // Driver codeint main(){    vector<vector<int>> a{{1, 2, 3, 4},                          {5, 6, 7, 8},                          {9, 10, 11, 12},                          {13, 14, 15, 16}};     for (int x : spiralOrder(a))    {        cout << x << " ";    }    return 0;} // This code is contributed by Yashvendra Singh
// Java program for the above approachimport java.util.*; class Solution {     // Function to print in spiral order    public static List<Integer> spiralOrder(int[][] matrix) {        List<Integer> ans = new ArrayList<Integer>();         if (matrix.length == 0)            return ans;         int R = matrix.length, C = matrix[0].length;        boolean[][] seen = new boolean[R][C];        int[] dr = { 0, 1, 0, -1 };        int[] dc = { 1, 0, -1, 0 };        int r = 0, c = 0, di = 0;         // Iterate from 0 to R * C - 1        for (int i = 0; i < R * C; i++) {            ans.add(matrix[r]);            seen[r] = true;            int cr = r + dr[di];            int cc = c + dc[di];             if (0 <= cr && cr < R && 0 <= cc && cc < C                    && !seen[cr][cc]) {                r = cr;                c = cc;            } else {                di = (di + 1) % 4;                r += dr[di];                c += dc[di];            }        }        return ans;    }     // 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 } };         System.out.println(spiralOrder(a));    }}
def spiralOrder(matrix):    ans = []     if (len(matrix) == 0):        return ans     R = len(matrix)    C = len(matrix[0])    seen = [[0 for i in range(C)] for j in range(R)]    dr = [0, 1, 0, -1]    dc = [1, 0, -1, 0]    r = 0    c = 0    di = 0     # Iterate from 0 to R * C - 1    for i in range(R * C):        ans.append(matrix[r])        seen[r] = True        cr = r + dr[di]        cc = c + dc[di]         if (0 <= cr and cr < R and 0 <= cc and cc < C and not(seen[cr][cc])):            r = cr            c = cc        else:            di = (di + 1) % 4            r += dr[di]            c += dc[di]    return ans  # Driver codea = [[1, 2, 3, 4],     [5, 6, 7, 8],     [9, 10, 11, 12],     [13, 14, 15, 16]] for x in spiralOrder(a):    print(x, end=" ")print()
// C# program for the above approachusing System;using System.Collections.Generic; public class GFG {     // Function to print in spiral order    public static List<int> spiralOrder(int[,] matrix)    {        List<int> ans = new List<int>();         if (matrix.Length == 0)            return ans;         int R = matrix.GetLength(0), C = matrix.GetLength(1);        bool[,] seen = new bool[R,C];        int[] dr = { 0, 1, 0, -1 };        int[] dc = { 1, 0, -1, 0 };        int r = 0, c = 0, di = 0;         // Iterate from 0 to R * C - 1        for (int i = 0; i < R * C; i++) {            ans.Add(matrix[r,c]);            seen[r,c] = true;            int cr = r + dr[di];            int cc = c + dc[di];             if (0 <= cr && cr < R && 0 <= cc && cc < C                && !seen[cr,cc]) {                r = cr;                c = cc;            }            else {                di = (di + 1) % 4;                r += dr[di];                c += dc[di];            }        }        return ans;    }     // 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 } };         spiralOrder(a).ForEach(i=>Console.Write(i+" "));    }} // This code is contributed by 29AjayKumar
<script> // JavaScript program for the above approach // Function to print in spiral orderfunction spiralOrder(matrix){    let ans = [];          if (matrix.length == 0)            return ans;          let R = matrix.length, C = matrix[0].length;        let seen = new Array(R);        for(let i=0;i<R;i++)        {            seen[i]=new Array(C);            for(let j=0;j<C;j++)            {                seen[i][j]=false;            }        }                 let dr = [ 0, 1, 0, -1 ];        let dc = [ 1, 0, -1, 0 ];        let r = 0, c = 0, di = 0;          // Iterate from 0 to R * C - 1        for (let i = 0; i < R * C; i++) {            ans.push(matrix[r]);            seen[r] = true;            let cr = r + dr[di];            let cc = c + dc[di];              if (0 <= cr && cr < R && 0 <= cc && cc < C                && !seen[cr][cc]) {                r = cr;                c = cc;            }            else {                di = (di + 1) % 4;                r += dr[di];                c += dc[di];            }        }        return ans;} // Driver Codelet a=[[ 1, 2, 3, 4 ],[ 5, 6, 7, 8 ],[ 9, 10, 11, 12 ],[ 13, 14, 15, 16 ]];document.write(spiralOrder(a));                         // This code is contributed by unknown2108 </script>
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 
Complexity Analysis:
Time Complexity: O(N), where N is the total number of elements in the input matrix. We add every element in the matrix to our final answer.
Auxiliary Space: O(N), the information stored in seen and in ans.
Method 2: 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 indexRun 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 mPrint 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.
Create and initialize variables k – starting row index, m – ending row index, l – starting column index, n – ending column indexRun 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 mPrint 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.
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
Java
Python3
C#
PHP
Javascript
// C++ Program to print a matrix spirally #include <bits/stdc++.h>using namespace std;#define R 4#define C 4 void 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}};     // Function Call    spiralPrint(R, C, a);    return 0;} // This is code is contributed by rathbhupendra
// C program to print the array in a// spiral form #include <stdio.h>#define R 4#define C 4 void 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}};     // Function Call    spiralPrint(R, C, a);    return 0;}
// 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 = 4;        int C = 4;        int a[][] =  {{1, 2, 3, 4},                   {5, 6, 7, 8},                   {9, 10, 11, 12},                   {13, 14, 15, 16}};         // Function Call        spiralPrint(R, C, a);    }} // Contributed by Pramod Kumar
# Python3 program to print# given matrix in spiral form  def 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 ]] R = 4C = 4 # Function CallspiralPrint(R, C, a) # This code is contributed by Nikita Tiwari.
// 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 = 4;        int C = 4;        int[, ] a =  {{1, 2, 3, 4},                   {5, 6, 7, 8},                   {9, 10, 11, 12},                   {13, 14, 15, 16}};         // Function Call        spiralPrint(R, C, a);    }} // This code is contributed by Sam007
<?php// PHP program to print a given// matrix in spiral form$R = 4;$C = 4; 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),           array(5, 6, 7, 8),           array(9, 10, 11, 12),           array(13, 14, 15, 16));// Function CallspiralPrint($R, $C, $a); // This code is contributed// by ChitraNayal?>
<script> // JavaScript Program to print a matrix spirally function spiralPrint(m, n, arr) {    let 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) {            document.write(arr[k][i] + ' ');        }        k++;         // print the last column from the remaining columns        for (i = k; i < m; ++i) {            document.write(arr[i][n - 1] + ' ');        }        n--;         // print the last row from the remaining rows        if (k < m) {            for (i = n - 1; i >= l; --i) {                document.write(arr[m - 1][i] + ' ');            }            m--;        }         // print the first column from the remaining columns        if (l < n) {            for (i = m - 1; i >= k; --i) {                document.write(arr[i][l] + ' ');            }            l++;        }    }} // function calllet arr = [[ 1, 2, 3, 4 ],     [ 5, 6, 7, 8 ],     [ 9, 10, 11, 12 ],     [ 13, 14, 15, 16 ]];let r = arr.length;let c = arr[0].length; spiralPrint(r, c, arr); // This code is contributed by karthiksrinivasprasad </script>
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.
Auxiliary Space: O(1). No extra space is required.
Method 3: (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 parametersCheck the base cases (starting index is less than or equal to ending index) and print the boundary elements in clockwise mannerPrint 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 mPrint 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.
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 parametersCheck the base cases (starting index is less than or equal to ending index) and print the boundary elements in clockwise mannerPrint 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 mPrint 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.
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 (starting 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++
Java
Python3
C#
Javascript
// 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 = j; 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 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 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 respectively  def 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# 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
<script>// JavaScript 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 respectively function print(arr, i, j, m, n) {     // If i or j lies outside the matrix    if (i >= m || j >= n) return;     // Print First Row    for (let p = j; p < n; p++) {        document.write(arr[i][p] + ' ')    }     // Print Last Column    for (let p = i + 1; p < m; p++) {        document.write(arr[p][n - 1] + ' ')    }     // Print Last Row, if Last and    // First Row are not same    if ((m - 1) != i) {        for (let p = n - 2; p >= j; p--) {            document.write(arr[m - 1][p] + ' ');        }    }     // Print First Column, if Last and    // First Column are not same       if ((n - 1) != j) {        for (let p = m - 2; p > i; p--) {            document.write(arr[p][j] + ' ');        }    }    print(arr, i + 1, j + 1, m - 1, n - 1)} // function calllet arr = [ [1, 2, 3, 4],            [5, 6, 7, 8],            [9, 10, 11, 12],            [13, 14, 15, 16]           ];let r = arr.length;let c = arr[0].length; print(arr, 0, 0, r, c); // This code is contributed by karthiksrinivasprasad </script>
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.
Auxiliary Space: O(1). No extra space is required.
Method 4: (DFS Recursive Approach)
Approach: Another recursive approach is to consider DFS movement within the matrix (right->down->left->up->right->..->end).
We do this by modifying the matrix itself such that when DFS algorithm visits each matrix cell it’s changed to a value which cannot be contained within the matrix. The DFS algorithm is terminated when it visits a cell such that all of its surrounding cells are already visited. The direction of the DFS search is controlled by a variable. 
Algorithm: 
create a DFS function which takes matrix, cell indices and directioncheck are cell indices pointing to a valid cell (that is, not visited and in bounds)? if not, skip this cellprint cell valuemark matrix cell pointed by indicates as visited by changing it to a value not supported in the matrixcheck are surrounding cells valid? if not stop algorithm, else continueif direction given is right then check, is the cell to the right valid? if so, DFS to the right cell given the steps above, else, change the direction to down and DFS downwards given the steps above.else, if the direction given is down then check, is the cell to the down valid? if so, DFS to the cell below given the steps above,                else, change the direction to left and DFS leftwards given the steps above.else, if the direction given is left then check, is the cell to the left valid? if so, DFS to the left cell given the steps above,                           else, change the direction to up and DFS upwards given the steps above.else, if the direction given is up then check, is the cell to the up valid? if so, DFS to the upper cell given the steps above,                           else, change the direction to right and DFS rightwards given the steps above.
create a DFS function which takes matrix, cell indices and direction
check are cell indices pointing to a valid cell (that is, not visited and in bounds)? if not, skip this cell
print cell value
mark matrix cell pointed by indicates as visited by changing it to a value not supported in the matrix
check are surrounding cells valid? if not stop algorithm, else continue
if direction given is right then check, is the cell to the right valid? if so, DFS to the right cell given the steps above, else, change the direction to down and DFS downwards given the steps above.
else, if the direction given is down then check, is the cell to the down valid? if so, DFS to the cell below given the steps above,                else, change the direction to left and DFS leftwards given the steps above.
else, if the direction given is left then check, is the cell to the left valid? if so, DFS to the left cell given the steps above,                           else, change the direction to up and DFS upwards given the steps above.
else, if the direction given is up then check, is the cell to the up valid? if so, DFS to the upper cell given the steps above,                           else, change the direction to right and DFS rightwards given the steps above.
Below is an implementation of this algorithm: 
C++
Java
Python3
C#
Javascript
#include <iostream>#include <vector>using namespace std;#define R 4#define C 4 bool isInBounds(int i, int j){    if (i < 0 || i >= R || j < 0 || j >= C)        return false;    return true;} // check if the position is blockedbool isBlocked(int matrix[R][C], int i, int j){    if (!isInBounds(i, j))        return true;    if (matrix[i][j] == -1)        return true;    return false;} // DFS code to traverse spirallyvoid spirallyDFSTravserse(int matrix[R][C], int i, int j,                          int dir, vector<int>& res){    if (isBlocked(matrix, i, j))        return;    bool allBlocked = true;    for (int k = -1; k <= 1; k += 2) {        allBlocked = allBlocked                     && isBlocked(matrix, k + i, j)                     && isBlocked(matrix, i, j + k);    }    res.push_back(matrix[i][j]);    matrix[i][j] = -1;    if (allBlocked) {        return;    }     // dir: 0 - right, 1 - down, 2 - left, 3 - up    int nxt_i = i;    int nxt_j = j;    int nxt_dir = dir;    if (dir == 0) {        if (!isBlocked(matrix, i, j + 1)) {            nxt_j++;        }        else {            nxt_dir = 1;            nxt_i++;        }    }    else if (dir == 1) {        if (!isBlocked(matrix, i + 1, j)) {            nxt_i++;        }        else {            nxt_dir = 2;            nxt_j--;        }    }    else if (dir == 2) {        if (!isBlocked(matrix, i, j - 1)) {            nxt_j--;        }        else {            nxt_dir = 3;            nxt_i--;        }    }    else if (dir == 3) {        if (!isBlocked(matrix, i - 1, j)) {            nxt_i--;        }        else {            nxt_dir = 0;            nxt_j++;        }    }    spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,                         res);} // to traverse spirallyvector<int> spirallyTraverse(int matrix[R][C]){    vector<int> res;    spirallyDFSTravserse(matrix, 0, 0, 0, res);    return res;} // 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    vector<int> res = spirallyTraverse(a);    int size = res.size();    for (int i = 0; i < size; ++i)        cout << res[i] << " ";    cout << endl;    return 0;} // code contributed by Ephi F
import java.io.*;import java.util.*; class GFG {    public static int R = 4, C = 4;    public static boolean isInBounds(int i, int j)    {        if (i < 0 || i >= R || j < 0 || j >= C)            return false;        return true;    }     // check if the position is blocked    public static boolean isBlocked(int[][] matrix, int i,                                    int j)    {        if (!isInBounds(i, j))            return true;        if (matrix[i][j] == -1)            return true;        return false;    }     // DFS code to traverse spirally    public static void    spirallyDFSTravserse(int[][] matrix, int i, int j,                         int dir, ArrayList<Integer> res)    {        if (isBlocked(matrix, i, j))            return;        boolean allBlocked = true;        for (int k = -1; k <= 1; k += 2) {            allBlocked = allBlocked                         && isBlocked(matrix, k + i, j)                         && isBlocked(matrix, i, j + k);        }        res.add(matrix[i][j]);        matrix[i][j] = -1;        if (allBlocked) {            return;        }         // dir: 0 - right, 1 - down, 2 - left, 3 - up        int nxt_i = i;        int nxt_j = j;        int nxt_dir = dir;        if (dir == 0) {            if (!isBlocked(matrix, i, j + 1)) {                nxt_j++;            }            else {                nxt_dir = 1;                nxt_i++;            }        }        else if (dir == 1) {            if (!isBlocked(matrix, i + 1, j)) {                nxt_i++;            }            else {                nxt_dir = 2;                nxt_j--;            }        }        else if (dir == 2) {            if (!isBlocked(matrix, i, j - 1)) {                nxt_j--;            }            else {                nxt_dir = 3;                nxt_i--;            }        }        else if (dir == 3) {            if (!isBlocked(matrix, i - 1, j)) {                nxt_i--;            }            else {                nxt_dir = 0;                nxt_j++;            }        }        spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,                             res);    }     // to traverse spirally    public static ArrayList<Integer>    spirallyTraverse(int[][] matrix)    {        ArrayList<Integer> res = new ArrayList<Integer>();        spirallyDFSTravserse(matrix, 0, 0, 0, res);        return res;    }     // 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        ArrayList<Integer> res = spirallyTraverse(a);        int size = res.size();        for (int i = 0; i < size; ++i)            System.out.print(res.get(i) + " ");        System.out.println();    }} // This code is contributed by Manu Pathria
R = 4C = 4  def isInBounds(i, j):    global R    global C    if (i < 0 or i >= R or j < 0 or j >= C):        return False    return True # Check if the position is blocked  def isBlocked(matrix, i, j):    if (not isInBounds(i, j)):        return True    if (matrix[i][j] == -1):        return True     return False # DFS code to traverse spirally  def spirallyDFSTravserse(matrix, i, j, Dir, res):    if (isBlocked(matrix, i, j)):        return     allBlocked = True    for k in range(-1, 2, 2):        allBlocked = allBlocked and isBlocked(            matrix, k + i, j) and isBlocked(matrix, i, j + k)     res.append(matrix[i][j])    matrix[i][j] = -1    if (allBlocked):        return     # dir: 0 - right, 1 - down, 2 - left, 3 - up    nxt_i = i    nxt_j = j    nxt_dir = Dir    if (Dir == 0):        if (not isBlocked(matrix, i, j + 1)):            nxt_j += 1        else:            nxt_dir = 1            nxt_i += 1     elif(Dir == 1):        if (not isBlocked(matrix, i + 1, j)):            nxt_i += 1        else:            nxt_dir = 2            nxt_j -= 1     elif(Dir == 2):        if (not isBlocked(matrix, i, j - 1)):            nxt_j -= 1        else:            nxt_dir = 3            nxt_i -= 1     elif(Dir == 3):        if (not isBlocked(matrix, i - 1, j)):            nxt_i -= 1        else:            nxt_dir = 0            nxt_j += 1     spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir, res) # To traverse spirally  def spirallyTraverse(matrix):    res = []    spirallyDFSTravserse(matrix, 0, 0, 0, res)    return res  # Driver codea = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] # Function Callres = spirallyTraverse(a)print(*res) # This code is contributed by rag2127
using System;using System.Collections.Generic; class GFG {     public static int R = 4, C = 4;    public static bool isInBounds(int i, int j)    {        if (i < 0 || i >= R || j < 0 || j >= C)            return false;         return true;    }     // Check if the position is blocked    public static bool isBlocked(int[, ] matrix, int i,                                 int j)    {        if (!isInBounds(i, j))            return true;        if (matrix[i, j] == -1)            return true;        return false;    }     // DFS code to traverse spirally    public static void spirallyDFSTravserse(int[, ] matrix,                                            int i, int j,                                            int dir,                                            List<int> res)    {        if (isBlocked(matrix, i, j))            return;         bool allBlocked = true;         for (int k = -1; k <= 1; k += 2) {            allBlocked = allBlocked                         && isBlocked(matrix, k + i, j)                         && isBlocked(matrix, i, j + k);        }        res.Add(matrix[i, j]);        matrix[i, j] = -1;         if (allBlocked) {            return;        }         // dir: 0 - right, 1 - down, 2 - left, 3 - up        int nxt_i = i;        int nxt_j = j;        int nxt_dir = dir;        if (dir == 0) {            if (!isBlocked(matrix, i, j + 1)) {                nxt_j++;            }            else {                nxt_dir = 1;                nxt_i++;            }        }        else if (dir == 1) {            if (!isBlocked(matrix, i + 1, j)) {                nxt_i++;            }            else {                nxt_dir = 2;                nxt_j--;            }        }        else if (dir == 2) {            if (!isBlocked(matrix, i, j - 1)) {                nxt_j--;            }            else {                nxt_dir = 3;                nxt_i--;            }        }        else if (dir == 3) {            if (!isBlocked(matrix, i - 1, j)) {                nxt_i--;            }            else {                nxt_dir = 0;                nxt_j++;            }        }        spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,                             res);    }     // To traverse spirally    public static List<int> spirallyTraverse(int[, ] matrix)    {        List<int> res = new List<int>();        spirallyDFSTravserse(matrix, 0, 0, 0, res);        return res;    }     // Driver code    static public void Main()    {        int[, ] a = { { 1, 2, 3, 4 },                      { 5, 6, 7, 8 },                      { 9, 10, 11, 12 },                      { 13, 14, 15, 16 } };         // Function Call        List<int> res = spirallyTraverse(a);        int size = res.Count;         for (int i = 0; i < size; ++i)            Console.Write(res[i] + " ");         Console.WriteLine();    }} // This code is contributed by avanitrachhadiya2155
<script> var R = 4, C = 4;function isInBounds(i, j){    if (i < 0 || i >= R || j < 0 || j >= C)        return false;    return true;}// Check if the position is blockedfunction isBlocked(matrix, i, j){    if (!isInBounds(i, j))        return true;    if (matrix[i][j] == -1)        return true;    return false;}// DFS code to traverse spirallyfunction spirallyDFSTravserse(matrix, i, j, dir, res){    if (isBlocked(matrix, i, j))        return;    var allBlocked = true;    for (var k = -1; k <= 1; k += 2) {        allBlocked = allBlocked                     && isBlocked(matrix, k + i, j)                     && isBlocked(matrix, i, j + k);    }    res.push(matrix[i][j]);    matrix[i][j] = -1;    if (allBlocked) {        return;    }    // dir: 0 - right, 1 - down, 2 - left, 3 - up    var nxt_i = i;    var nxt_j = j;    var nxt_dir = dir;    if (dir == 0) {        if (!isBlocked(matrix, i, j + 1)) {            nxt_j++;        }        else {            nxt_dir = 1;            nxt_i++;        }    }    else if (dir == 1) {        if (!isBlocked(matrix, i + 1, j)) {            nxt_i++;        }        else {            nxt_dir = 2;            nxt_j--;        }    }    else if (dir == 2) {        if (!isBlocked(matrix, i, j - 1)) {            nxt_j--;        }        else {            nxt_dir = 3;            nxt_i--;        }    }    else if (dir == 3) {        if (!isBlocked(matrix, i - 1, j)) {            nxt_i--;        }        else {            nxt_dir = 0;            nxt_j++;        }    }    spirallyDFSTravserse(matrix, nxt_i, nxt_j, nxt_dir,                         res);}// To traverse spirallyfunction spirallyTraverse(matrix){    var res = [];    spirallyDFSTravserse(matrix, 0, 0, 0, res);    return res;}// Driver codevar a = [ [ 1, 2, 3, 4 ],              [ 5, 6, 7, 8 ],              [ 9, 10, 11, 12 ],              [ 13, 14, 15, 16 ]];// Function Callvar res = spirallyTraverse(a);var size = res.length;for (var i = 0; i < size; ++i)    document.write(res[i] + " "); </script>
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.Auxiliary Space: O(1). No extra space is required (without consideration of the stack used by the recursion). 
Diagonal traversal of Matrix
Print matrix in antispiral form
Print a given matrix in zigzag form
Please write comments if you find the above code incorrect, or find other ways to solve the same problem. 
ukasp
rathbhupendra
Ankur Goel
29AjayKumar
princi singh
andrew1234
avsadityavardhan
harshvardhansingh17
ephi2g
theadinova
swaroopksahu
manupathria
avanitrachhadiya2155
karthiksrinivasprasad
rag2127
koulick_sadhu
rohitsingh07052
yashvendrasengar1111
sonirudrakshi99
itsok
unknown2108
sagartomar9927
animeshbarun
rohithp8899
sumitgumber28
nikhil070g
harendrakumar123
Accolite
Amazon
Amazon-Question
BrowserStack
D-E-Shaw
MakeMyTrip
MAQ Software
Microsoft
Morgan Stanley
Nagarro
nearbuy
Oracle
pattern-printing
Paytm
Snapdeal
Snapdeal-Question
spiral
Zoho
Arrays
Matrix
School Programming
Paytm
Zoho
Morgan Stanley
Accolite
Amazon
Microsoft
Snapdeal
D-E-Shaw
MakeMyTrip
Oracle
MAQ Software
nearbuy
Nagarro
BrowserStack
Arrays
pattern-printing
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Arrays in Java
Arrays in C/C++
Write a program to reverse an array or string
Program for array rotation
Largest Sum Contiguous Subarray
Matrix Chain Multiplication | DP-8
Program to find largest element in an array
Rat in a Maze | Backtracking-2
Maximum size square sub-matrix with all 1s
Sudoku | Backtracking-7