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.
if(0<=cr andcr < m and0<=cc andcc < n andnot(seen[cr][cc])):
x =cr
y =cc
else:
di =(di +1) %4
x +=dr[di]
y +=dc[di]
returnans
# Driver code
a =[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]
forx inspiralOrder(a):
print(x, end=" ")
print()
C#
// C# program for the above approach
usingSystem;
usingSystem.Collections.Generic;
publicclassGFG {
// Function to print in spiral order
publicstaticList<int> spiralOrder(int[,] matrix)
{
List<int> ans = newList<int>();
if(matrix.Length == 0)
returnans;
intR = matrix.GetLength(0), C = matrix.GetLength(1);
bool[,] seen = newbool[R,C];
int[] dr = { 0, 1, 0, -1 };
int[] dc = { 1, 0, -1, 0 };
intr = 0, c = 0, di = 0;
// Iterate from 0 to R * C - 1
for(inti = 0; i < R * C; i++) {
ans.Add(matrix[r,c]);
seen[r,c] = true;
intcr = r + dr[di];
intcc = 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];
}
}
returnans;
}
// Driver Code
publicstaticvoidMain(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
Javascript
<script>
// JavaScript program for the above approach
// Function to print in spiral order
functionspiralOrder(matrix)
{
let ans = [];
if(matrix.length == 0)
returnans;
let R = matrix.length, C = matrix[0].length;
let seen = newArray(R);
for(let i=0;i<R;i++)
{
seen[i]=newArray(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];
}
}
returnans;
}
// Driver Code
let 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>
Output
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 that print 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>
usingnamespacestd;
#define R 4
#define C 4
voidspiralPrint(intm, intn, inta[R][C])
{
inti, 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 */
intmain()
{
inta[R][C] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
// Function Call
spiralPrint(R, C, a);
return0;
}
// This is code is contributed by rathbhupendra
C
// C program to print the array in a
// spiral form
#include <stdio.h>
#define R 4
#define C 4
voidspiralPrint(intm, intn, inta[R][C])
{
inti, 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 */
intmain()
{
inta[R][C] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
// Function Call
spiralPrint(R, C, a);
return0;
}
Java
// Java program to print a given matrix in spiral form
importjava.io.*;
classGFG {
// Function print matrix in spiral form
staticvoidspiralPrint(intm, intn, inta[][])
{
inti, 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
publicstaticvoidmain(String[] args)
{
intR = 4;
intC = 4;
inta[][] = {{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
# Python3 program to print
# given matrix in spiral form
defspiralPrint(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 andl < n):
# Print the first row from
# the remaining rows
fori inrange(l, n):
print(a[k][i], end=" ")
k +=1
# Print the last column from
# the remaining columns
fori inrange(k, m):
print(a[i][n -1], end=" ")
n -=1
# Print the last row from
# the remaining rows
if(k < m):
fori inrange(n -1, (l -1), -1):
print(a[m -1][i], end=" ")
m -=1
# Print the first column from
# the remaining columns
if(l < n):
fori inrange(m -1, k -1, -1):
print(a[i][l], end=" ")
l +=1
# Driver Code
a =[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[ 13, 14, 15, 16]]
R =4
C =4
# Function Call
spiralPrint(R, C, a)
# This code is contributed by Nikita Tiwari.
C#
// C# program to print a given
// matrix in spiral form
usingSystem;
classGFG {
// Function print matrix in spiral form
staticvoidspiralPrint(intm, intn, int[, ] a)
{
inti, 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
publicstaticvoidMain()
{
intR = 4;
intC = 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
// PHP program to print a given
// matrix in spiral form
$R= 4;
$C= 4;
functionspiralPrint($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 Call
spiralPrint($R, $C, $a);
// This code is contributed
// by ChitraNayal
?>
Javascript
<script>
// JavaScript Program to print a matrix spirally
functionspiralPrint(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 call
let 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>
Output
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 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 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++
// C++. program for the above approach
#include <iostream>
usingnamespacestd;
#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 respectively
voidprint(intarr[R][C], inti, intj, intm, intn)
{
// If i or j lies outside the matrix
if(i >= m or j >= n)
return;
// Print First Row
for(intp = j; p < n; p++)
cout << arr[i][p] << " ";
// Print Last Column
for(intp = 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(intp = 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(intp = m - 2; p > i; p--)
cout << arr[p][j] << " ";
print(arr, i + 1, j + 1, m - 1, n - 1);
}
// Driver Code
intmain()
{
inta[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);
return0;
}
// This Code is contributed by Ankur Goel
Java
// Java program for the above approach
importjava.util.*;
classGFG {
staticintR = 4;
staticintC = 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
staticvoidprint(intarr[][], inti, intj, intm,
intn)
{
// If i or j lies outside the matrix
if(i >= m || j >= n) {
return;
}
// Print First Row
for(intp = i; p < n; p++) {
System.out.print(arr[i][p] + " ");
}
// Print Last Column
for(intp = 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(intp = 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(intp = m - 2; p > i; p--) {
System.out.print(arr[p][j] + " ");
}
}
print(arr, i + 1, j + 1, m - 1, n - 1);
}
// Driver Code
publicstaticvoidmain(String[] args)
{
inta[][] = { { 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 respectively
defprintdata(arr, i, j, m, n):
# If i or j lies outside the matrix
if(i >=m orj >=n):
return
# Print First Row
forp inrange(i, n):
print(arr[i][p], end=" ")
# Print Last Column
forp inrange(i +1, m):
print(arr[p][n -1], end=" ")
# Print Last Row, if Last and
# First Row are not same
if((m -1) !=i):
forp inrange(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):
forp inrange(m -2, i, -1):
print(arr[p][j], end=" ")
printdata(arr, i +1, j +1, m -1, n -1)
# Driver code
R =4
C =4
arr =[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]]
# Function Call
printdata(arr, 0, 0, R, C)
# This code is contributed by avsadityavardhan
C#
// C# program for the above approach
usingSystem;
classGFG {
staticintR = 4;
staticintC = 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
staticvoidprint(int[, ] arr, inti, intj, intm,
intn)
{
// If i or j lies outside the matrix
if(i >= m || j >= n) {
return;
}
// Print First Row
for(intp = i; p < n; p++) {
Console.Write(arr[i, p] + " ");
}
// Print Last Column
for(intp = 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(intp = 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(intp = m - 2; p > i; p--) {
Console.Write(arr[p, j] + " ");
}
}
print(arr, i + 1, j + 1, m - 1, n - 1);
}
// Driver Code
publicstaticvoidMain(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
Javascript
<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
functionprint(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 call
let 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>
Output
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 that takes matrix, cell indices and direction
checks 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 the algorithm, else continue
if the direction given right then check, if the cell to the right is 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, if the cell to the down is 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, if the cell to the left is 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, if the cell to the up is 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.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy