Print a given matrix in spiral form
Last Updated :
14 Jun, 2023
Given a 2D array, print it in spiral form.
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.
Print a given matrix in spiral form using the simulation approach:
To solve the problem follow the below idea:
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
Follow the given steps to solve the problem:
- 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
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > spiralOrder(vector<vector< int > >& matrix)
{
int m = matrix.size(), n = matrix[0].size();
vector< int > ans;
if (m == 0)
return ans;
vector<vector< bool > > seen(m, vector< bool >(n, false ));
int dr[] = { 0, 1, 0, -1 };
int dc[] = { 1, 0, -1, 0 };
int x = 0, y = 0, di = 0;
for ( int i = 0; i < m * n; i++) {
ans.push_back(matrix[x][y]);
seen[x][y] = true ;
int newX = x + dr[di];
int newY = y + dc[di];
if (0 <= newX && newX < m && 0 <= newY && newY < n
&& !seen[newX][newY]) {
x = newX;
y = newY;
}
else {
di = (di + 1) % 4;
x += dr[di];
y += dc[di];
}
}
return ans;
}
int 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;
}
|
Java
import java.util.*;
class Solution {
public static List<Integer> spiralOrder( int [][] matrix)
{
List<Integer> ans = new ArrayList<Integer>();
if (matrix.length == 0 )
return ans;
int m = matrix.length, n = matrix[ 0 ].length;
boolean [][] seen = new boolean [m][n];
int [] dr = { 0 , 1 , 0 , - 1 };
int [] dc = { 1 , 0 , - 1 , 0 };
int x = 0 , y = 0 , di = 0 ;
for ( int i = 0 ; i < m * n; i++) {
ans.add(matrix[x][y]);
seen[x][y] = true ;
int cr = x + dr[di];
int cc = y + dc[di];
if ( 0 <= cr && cr < m && 0 <= cc && cc < n
&& !seen[cr][cc]) {
x = cr;
y = cc;
}
else {
di = (di + 1 ) % 4 ;
x += dr[di];
y += dc[di];
}
}
return ans;
}
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));
}
}
|
Python3
def spiralOrder(matrix):
ans = []
if ( len (matrix) = = 0 ):
return ans
m = len (matrix)
n = len (matrix[ 0 ])
seen = [[ 0 for i in range (n)] for j in range (m)]
dr = [ 0 , 1 , 0 , - 1 ]
dc = [ 1 , 0 , - 1 , 0 ]
x = 0
y = 0
di = 0
for i in range (m * n):
ans.append(matrix[x][y])
seen[x][y] = True
cr = x + dr[di]
cc = y + dc[di]
if ( 0 < = cr and cr < m and 0 < = cc and cc < n and not (seen[cr][cc])):
x = cr
y = cc
else :
di = (di + 1 ) % 4
x + = dr[di]
y + = dc[di]
return ans
if __name__ = = "__main__" :
a = [[ 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#
using System;
using System.Collections.Generic;
public class GFG {
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;
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;
}
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 + " " ));
}
}
|
Javascript
<script>
function 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;
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;
}
let a=[[ 1, 2, 3, 4 ],[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],[ 13, 14, 15, 16 ]];
document.write(spiralOrder(a));
</script>
|
Output
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
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.
Print a given matrix in spiral form by dividing the matrix into cycles:
To solve the problem follow the below idea:
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 are 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
Follow the given steps to solve the problem:
- 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 the 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 approach:
C++
#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;
while (k < m && l < n) {
for (i = l; i < n; ++i) {
cout << a[k][i] << " " ;
}
k++;
for (i = k; i < m; ++i) {
cout << a[i][n - 1] << " " ;
}
n--;
if (k < m) {
for (i = n - 1; i >= l; --i) {
cout << a[m - 1][i] << " " ;
}
m--;
}
if (l < n) {
for (i = m - 1; i >= k; --i) {
cout << a[i][l] << " " ;
}
l++;
}
}
}
int main()
{
int a[R][C] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
spiralPrint(R, C, a);
return 0;
}
|
C
#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;
while (k < m && l < n) {
for (i = l; i < n; ++i) {
printf ( "%d " , a[k][i]);
}
k++;
for (i = k; i < m; ++i) {
printf ( "%d " , a[i][n - 1]);
}
n--;
if (k < m) {
for (i = n - 1; i >= l; --i) {
printf ( "%d " , a[m - 1][i]);
}
m--;
}
if (l < n) {
for (i = m - 1; i >= k; --i) {
printf ( "%d " , a[i][l]);
}
l++;
}
}
}
int main()
{
int a[R][C] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
spiralPrint(R, C, a);
return 0;
}
|
Java
import java.io.*;
class GFG {
static void spiralPrint( int m, int n, int a[][])
{
int i, k = 0 , l = 0 ;
while (k < m && l < n) {
for (i = l; i < n; ++i) {
System.out.print(a[k][i] + " " );
}
k++;
for (i = k; i < m; ++i) {
System.out.print(a[i][n - 1 ] + " " );
}
n--;
if (k < m) {
for (i = n - 1 ; i >= l; --i) {
System.out.print(a[m - 1 ][i] + " " );
}
m--;
}
if (l < n) {
for (i = m - 1 ; i >= k; --i) {
System.out.print(a[i][l] + " " );
}
l++;
}
}
}
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 } };
spiralPrint(R, C, a);
}
}
|
Python3
def spiralPrint(m, n, a):
k = 0
l = 0
while (k < m and l < n):
for i in range (l, n):
print (a[k][i], end = " " )
k + = 1
for i in range (k, m):
print (a[i][n - 1 ], end = " " )
n - = 1
if (k < m):
for i in range (n - 1 , (l - 1 ), - 1 ):
print (a[m - 1 ][i], end = " " )
m - = 1
if (l < n):
for i in range (m - 1 , k - 1 , - 1 ):
print (a[i][l], end = " " )
l + = 1
a = [[ 1 , 2 , 3 , 4 ],
[ 5 , 6 , 7 , 8 ],
[ 9 , 10 , 11 , 12 ],
[ 13 , 14 , 15 , 16 ]]
R = 4
C = 4
spiralPrint(R, C, a)
|
C#
using System;
class GFG {
static void spiralPrint( int m, int n, int [, ] a)
{
int i, k = 0, l = 0;
while (k < m && l < n) {
for (i = l; i < n; ++i) {
Console.Write(a[k, i] + " " );
}
k++;
for (i = k; i < m; ++i) {
Console.Write(a[i, n - 1] + " " );
}
n--;
if (k < m) {
for (i = n - 1; i >= l; --i) {
Console.Write(a[m - 1, i] + " " );
}
m--;
}
if (l < n) {
for (i = m - 1; i >= k; --i) {
Console.Write(a[i, l] + " " );
}
l++;
}
}
}
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 } };
spiralPrint(R, C, a);
}
}
|
PHP
<?php
$R = 4;
$C = 4;
function spiralPrint( $m , $n , & $a )
{
$k = 0;
$l = 0;
while ( $k < $m && $l < $n )
{
for ( $i = $l ; $i < $n ; ++ $i )
{
echo $a [ $k ][ $i ] . " " ;
}
$k ++;
for ( $i = $k ; $i < $m ; ++ $i )
{
echo $a [ $i ][ $n - 1] . " " ;
}
$n --;
if ( $k < $m )
{
for ( $i = $n - 1; $i >= $l ; -- $i )
{
echo $a [ $m - 1][ $i ] . " " ;
}
$m --;
}
if ( $l < $n )
{
for ( $i = $m - 1; $i >= $k ; -- $i )
{
echo $a [ $i ][ $l ] . " " ;
}
$l ++;
}
}
}
$a = array ( array (1, 2, 3, 4),
array (5, 6, 7, 8),
array (9, 10, 11, 12),
array (13, 14, 15, 16));
spiralPrint( $R , $C , $a );
?>
|
Javascript
<script>
function spiralPrint(m, n, arr) {
let i, k = 0, l = 0;
while (k < m && l < n) {
for (i = l; i < n; ++i) {
document.write(arr[k][i] + ' ' );
}
k++;
for (i = k; i < m; ++i) {
document.write(arr[i][n - 1] + ' ' );
}
n--;
if (k < m) {
for (i = n - 1; i >= l; --i) {
document.write(arr[m - 1][i] + ' ' );
}
m--;
}
if (l < n) {
for (i = m - 1; i >= k; --i) {
document.write(arr[i][l] + ' ' );
}
l++;
}
}
}
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);
</script>
|
Output
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
Time Complexity: O(M*N). To traverse the matrix O(M*M) time is required.
Auxiliary Space: O(1). No extra space is required.
Print a given matrix in a spiral using recursion:
To solve the problem follow the below idea:
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
Follow the given steps to solve the problem:
- 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 the ending index) and print the boundary elements 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 the 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 approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define R 4
#define C 4
void print( int arr[R][C], int i, int j, int m, int n)
{
if (i >= m or j >= n)
return ;
for ( int p = j; p < n; p++)
cout << arr[i][p] << " " ;
for ( int p = i + 1; p < m; p++)
cout << arr[p][n - 1] << " " ;
if ((m - 1) != i)
for ( int p = n - 2; p >= j; p--)
cout << arr[m - 1][p] << " " ;
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);
}
int main()
{
int a[R][C] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
print(a, 0, 0, R, C);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int R = 4 ;
static int C = 4 ;
static void print( int arr[][], int i, int j, int m,
int n)
{
if (i >= m || j >= n) {
return ;
}
for ( int p = i; p < n; p++) {
System.out.print(arr[i][p] + " " );
}
for ( int p = i + 1 ; p < m; p++) {
System.out.print(arr[p][n - 1 ] + " " );
}
if ((m - 1 ) != i) {
for ( int p = n - 2 ; p >= j; p--) {
System.out.print(arr[m - 1 ][p] + " " );
}
}
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 );
}
public static void main(String[] args)
{
int a[][] = { { 1 , 2 , 3 , 4 },
{ 5 , 6 , 7 , 8 },
{ 9 , 10 , 11 , 12 },
{ 13 , 14 , 15 , 16 } };
print(a, 0 , 0 , R, C);
}
}
|
Python3
def printdata(arr, i, j, m, n):
if (i > = m or j > = n):
return
for p in range (i, n):
print (arr[i][p], end = " " )
for p in range (i + 1 , m):
print (arr[p][n - 1 ], end = " " )
if ((m - 1 ) ! = i):
for p in range (n - 2 , j - 1 , - 1 ):
print (arr[m - 1 ][p], end = " " )
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 )
if __name__ = = "__main__" :
R = 4
C = 4
arr = [[ 1 , 2 , 3 , 4 ],
[ 5 , 6 , 7 , 8 ],
[ 9 , 10 , 11 , 12 ],
[ 13 , 14 , 15 , 16 ]]
printdata(arr, 0 , 0 , R, C)
|
C#
using System;
class GFG {
static int R = 4;
static int C = 4;
static void print( int [, ] arr, int i, int j, int m,
int n)
{
if (i >= m || j >= n) {
return ;
}
for ( int p = i; p < n; p++) {
Console.Write(arr[i, p] + " " );
}
for ( int p = i + 1; p < m; p++) {
Console.Write(arr[p, n - 1] + " " );
}
if ((m - 1) != i) {
for ( int p = n - 2; p >= j; p--) {
Console.Write(arr[m - 1, p] + " " );
}
}
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);
}
public static void Main(String[] args)
{
int [, ] a = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
print(a, 0, 0, R, C);
}
}
|
Javascript
<script>
function print(arr, i, j, m, n) {
if (i >= m || j >= n) return ;
for (let p = j; p < n; p++) {
document.write(arr[i][p] + ' ' )
}
for (let p = i + 1; p < m; p++) {
document.write(arr[p][n - 1] + ' ' )
}
if ((m - 1) != i) {
for (let p = n - 2; p >= j; p--) {
document.write(arr[m - 1][p] + ' ' );
}
}
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)
}
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);
</script>
|
Output
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
Time Complexity: O(M*N). To traverse the matrix O(m*n) time is required.
Auxiliary Space: O(1). No extra space is required.
Print a given matrix in spiral using DFS:
To solve the problem follow the below idea:
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.
Follow the given steps to solve the problem:
- 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 is 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
Below is an implementation of the above approach:
C++
#include <bits/stdc++.h>
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 ;
}
bool isBlocked( int matrix[R][C], int i, int j)
{
if (!isInBounds(i, j))
return true ;
if (matrix[i][j] == -1)
return true ;
return false ;
}
void spirallyDFSTraverse( 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 ;
}
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);
}
vector< int > spirallyTraverse( int matrix[R][C])
{
vector< int > res;
spirallyDFSTravserse(matrix, 0, 0, 0, res);
return res;
}
int main()
{
int a[R][C] = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
vector< int > res = spirallyTraverse(a);
int size = res.size();
for ( int i = 0; i < size; ++i)
cout << res[i] << " " ;
cout << endl;
return 0;
}
|
Java
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 ;
}
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 ;
}
public static void
spirallyDFSTraverse( 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 ;
}
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);
}
public static ArrayList<Integer>
spirallyTraverse( int [][] matrix)
{
ArrayList<Integer> res = new ArrayList<Integer>();
spirallyDFSTravserse(matrix, 0 , 0 , 0 , res);
return res;
}
public static void main(String[] args)
{
int a[][] = { { 1 , 2 , 3 , 4 },
{ 5 , 6 , 7 , 8 },
{ 9 , 10 , 11 , 12 },
{ 13 , 14 , 15 , 16 } };
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();
}
}
|
Python3
R = 4
C = 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
def isBlocked(matrix, i, j):
if ( not isInBounds(i, j)):
return True
if (matrix[i][j] = = - 1 ):
return True
return False
def spirallyDFSTraverse(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
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)
def spirallyTraverse(matrix):
res = []
spirallyDFSTravserse(matrix, 0 , 0 , 0 , res)
return res
if __name__ = = "__main__" :
a = [[ 1 , 2 , 3 , 4 ], [ 5 , 6 , 7 , 8 ], [ 9 , 10 , 11 , 12 ], [ 13 , 14 , 15 , 16 ]]
res = spirallyTraverse(a)
print ( * res)
|
C#
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 ;
}
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 ;
}
public static void spirallyDFSTraverse( 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 ;
}
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);
}
public static List< int > spirallyTraverse( int [, ] matrix)
{
List< int > res = new List< int >();
spirallyDFSTravserse(matrix, 0, 0, 0, res);
return res;
}
static public void Main()
{
int [, ] a = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 } };
List< int > res = spirallyTraverse(a);
int size = res.Count;
for ( int i = 0; i < size; ++i)
Console.Write(res[i] + " " );
Console.WriteLine();
}
}
|
Javascript
<script>
var R = 4, C = 4;
function isInBounds(i, j)
{
if (i < 0 || i >= R || j < 0 || j >= C)
return false ;
return true ;
}
function isBlocked(matrix, i, j)
{
if (!isInBounds(i, j))
return true ;
if (matrix[i][j] == -1)
return true ;
return false ;
}
function spirallyDFSTraverse(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 ;
}
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);
}
function spirallyTraverse(matrix)
{
var res = [];
spirallyDFSTravserse(matrix, 0, 0, 0, res);
return res;
}
var a = [ [ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],
[ 13, 14, 15, 16 ]];
var res = spirallyTraverse(a);
var size = res.length;
for ( var i = 0; i < size; ++i)
document.write(res[i] + " " );
</script>
|
Output
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
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).
Similar questions:
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.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...