Given two values m and n, fill a matrix of size ‘m*n’ in a spiral (or circular) fashion (clockwise) with natural numbers from 1 to m*n.
Examples:
Input : m = 4, n = 4 Output : 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 Input : m = 3, n = 4 Output : 1 2 3 4 10 11 12 5 9 8 7 6
The idea is based on Print a given matrix in spiral form. We create a matrix of size m * n and traverse it in a spiral fashion. While traversing, we keep track of a variable “val” to fill the next value, we increment “val” one by one and put its values in the matrix.
Implementation:
C++
// C++ program to fill a matrix with values from // 1 to n*n in spiral fashion. #include <bits/stdc++.h> using namespace std;
const int MAX = 100;
// Fills a[m][n] with values from 1 to m*n in // spiral fashion. void spiralFill( int m, int n, int a[][MAX])
{ // Initialize value to be filled in matrix
int val = 1;
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
int k = 0, l = 0;
while (k < m && l < n)
{
/* Print the first row from the remaining
rows */
for ( int i = l; i < n; ++i)
a[k][i] = val++;
k++;
/* Print the last column from the remaining
columns */
for ( int i = k; i < m; ++i)
a[i][n-1] = val++;
n--;
/* Print the last row from the remaining
rows */
if (k < m)
{
for ( int i = n-1; i >= l; --i)
a[m-1][i] = val++;
m--;
}
/* Print the first column from the remaining
columns */
if (l < n)
{
for ( int i = m-1; i >= k; --i)
a[i][l] = val++;
l++;
}
}
} /* Driver program to test above functions */ int main()
{ int m = 4, n = 4;
int a[MAX][MAX];
spiralFill(m, n, a);
for ( int i=0; i<m; i++)
{
for ( int j=0; j<n; j++)
cout << a[i][j] << " " ;
cout << endl;
}
return 0;
} |
C
// C program to fill a matrix with values from // 1 to n*n in spiral fashion. #include <stdio.h> const int MAX = 100;
// Fills a[m][n] with values from 1 to m*n in // spiral fashion. void spiralFill( int m, int n, int a[][MAX])
{ // Initialize value to be filled in matrix
int val = 1;
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
int k = 0, l = 0;
while (k < m && l < n)
{
/* Print the first row from the remaining
rows */
for ( int i = l; i < n; ++i)
a[k][i] = val++;
k++;
/* Print the last column from the remaining
columns */
for ( int i = k; i < m; ++i)
a[i][n-1] = val++;
n--;
/* Print the last row from the remaining
rows */
if (k < m)
{
for ( int i = n-1; i >= l; --i)
a[m-1][i] = val++;
m--;
}
/* Print the first column from the remaining
columns */
if (l < n)
{
for ( int i = m-1; i >= k; --i)
a[i][l] = val++;
l++;
}
}
} /* Driver program to test above functions */ int main()
{ int m = 4, n = 4;
int a[MAX][MAX];
spiralFill(m, n, a);
for ( int i=0; i<m; i++)
{
for ( int j=0; j<n; j++)
printf ( "%d " ,a[i][j]);
printf ( "\n" );
}
return 0;
} // This code is contributed by kothavvsaakash. |
Java
// Java program to fill a matrix with values from // 1 to n*n in spiral fashion. import java.io.*;
class GFG {
static int MAX = 100 ;
// Fills a[m][n] with values from 1 to m*n in // spiral fashion. static void spiralFill( int m, int n, int a[][]) {
// Initialize value to be filled in matrix
int val = 1 ;
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
int k = 0 , l = 0 ;
while (k < m && l < n) {
/* Print the first row from the remaining
rows */
for ( int i = l; i < n; ++i) {
a[k][i] = val++;
}
k++;
/* Print the last column from the remaining
columns */
for ( int i = k; i < m; ++i) {
a[i][n - 1 ] = val++;
}
n--;
/* Print the last row from the remaining
rows */
if (k < m) {
for ( int i = n - 1 ; i >= l; --i) {
a[m - 1 ][i] = val++;
}
m--;
}
/* Print the first column from the remaining
columns */
if (l < n) {
for ( int i = m - 1 ; i >= k; --i) {
a[i][l] = val++;
}
l++;
}
}
}
/* Driver program to test above functions */
public static void main(String[] args) {
int m = 4 , n = 4 ;
int a[][] = new int [MAX][MAX];
spiralFill(m, n, a);
for ( int i = 0 ; i < m; i++) {
for ( int j = 0 ; j < n; j++) {
System.out.print(a[i][j] + " " );
}
System.out.println( "" );
}
}
} /* This Java code is contributed by PrinciRaj1992*/ |
Python3
# Python program to fill a matrix with # values from 1 to n*n in spiral fashion. # Fills a[m][n] with values # from 1 to m*n in spiral fashion. def spiralFill(m, n, a):
# Initialize value to be filled in matrix.
val = 1
# k - starting row index
# m - ending row index
# l - starting column index
# n - ending column index
k, l = 0 , 0
while (k < m and l < n):
# Print the first row from the remaining rows.
for i in range (l, n):
a[k][i] = val
val + = 1
k + = 1
# Print the last column from the remaining columns.
for i in range (k, m):
a[i][n - 1 ] = val
val + = 1
n - = 1
# Print the last row from the remaining rows.
if (k < m):
for i in range (n - 1 , l - 1 , - 1 ):
a[m - 1 ][i] = val
val + = 1
m - = 1
# Print the first column from the remaining columns.
if (l < n):
for i in range (m - 1 , k - 1 , - 1 ):
a[i][l] = val
val + = 1
l + = 1
# Driver program if __name__ = = '__main__' :
m, n = 4 , 4
a = [[ 0 for j in range (n)] for i in range (m)]
spiralFill(m, n, a)
for i in range (m):
for j in range (n):
print (a[i][j], end = ' ' )
print ('')
# This code is contributed by Parin Shah |
C#
// C# program to fill a matrix with values from // 1 to n*n in spiral fashion. using System;
class GFG {
static int MAX = 100;
// Fills a[m,n] with values from 1 to m*n in // spiral fashion. static void spiralFill( int m, int n, int [,] a) {
// Initialize value to be filled in matrix
int val = 1;
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
int k = 0, l = 0;
while (k < m && l < n) {
/* Print the first row from the remaining
rows */
for ( int i = l; i < n; ++i) {
a[k,i] = val++;
}
k++;
/* Print the last column from the remaining
columns */
for ( int i = k; i < m; ++i) {
a[i,n - 1] = val++;
}
n--;
/* Print the last row from the remaining
rows */
if (k < m) {
for ( int i = n - 1; i >= l; --i) {
a[m - 1,i] = val++;
}
m--;
}
/* Print the first column from the remaining
columns */
if (l < n) {
for ( int i = m - 1; i >= k; --i) {
a[i,l] = val++;
}
l++;
}
}
}
/* Driver program to test above functions */
public static void Main() {
int m = 4, n = 4;
int [,] a = new int [MAX,MAX];
spiralFill(m, n, a);
for ( int i = 0; i < m; i++) {
for ( int j = 0; j < n; j++) {
Console.Write(a[i,j] + " " );
}
Console.Write( "\n" );
}
}
} |
PHP
<?php // PHP program to fill a matrix with values // from 1 to n*n in spiral fashion. // Fills a[m][n] with values from 1 to // m*n in spiral fashion. function spiralFill( $m , $n , & $a )
{ // Initialize value to be filled
// in matrix
$val = 1;
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
$k = 0;
$l = 0;
while ( $k < $m && $l < $n )
{
/* Print the first row from
the remaining rows */
for ( $i = $l ; $i < $n ; ++ $i )
$a [ $k ][ $i ] = $val ++;
$k ++;
/* Print the last column from
the remaining columns */
for ( $i = $k ; $i < $m ; ++ $i )
$a [ $i ][ $n - 1] = $val ++;
$n --;
/* Print the last row from
the remaining rows */
if ( $k < $m )
{
for ( $i = $n - 1; $i >= $l ; -- $i )
$a [ $m - 1][ $i ] = $val ++;
$m --;
}
/* Print the first column from
the remaining columns */
if ( $l < $n )
{
for ( $i = $m - 1; $i >= $k ; -- $i )
$a [ $i ][ $l ] = $val ++;
$l ++;
}
}
} // Driver Code $m = 4;
$n = 4;
spiralFill( $m , $n , $a );
for ( $i = 0; $i < $m ; $i ++)
{ for ( $j = 0; $j < $n ; $j ++)
{
echo ( $a [ $i ][ $j ]);
echo ( " " );
}
echo ( "\n" );
} // This code is contributed // by Shivi_Aggarwal ?> |
Javascript
<script> // Javascript program to fill a matrix with values from // 1 to n*n in spiral fashion. const MAX = 100; // Fills a[m][n] with values from 1 to m*n in // spiral fashion. function spiralFill(m, n, a)
{ // Initialize value to be filled in matrix
let val = 1;
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
let k = 0, l = 0;
while (k < m && l < n)
{
/* Print the first row from the remaining
rows */
for (let i = l; i < n; ++i)
a[k][i] = val++;
k++;
/* Print the last column from the remaining
columns */
for (let i = k; i < m; ++i)
a[i][n-1] = val++;
n--;
/* Print the last row from the remaining
rows */
if (k < m)
{
for (let i = n - 1; i >= l; --i)
a[m-1][i] = val++;
m--;
}
/* Print the first column from the remaining
columns */
if (l < n)
{
for (let i = m - 1; i >= k; --i)
a[i][l] = val++;
l++;
}
}
} /* Driver program to test above functions */ let m = 4, n = 4;
let a = Array.from(Array(MAX), () => new Array(MAX));
spiralFill(m, n, a);
for (let i = 0; i < m; i++)
{
for (let j = 0; j < n; j++)
document.write(a[i][j] + " " );
document.write( "<br>" );
}
// This code is contributed by souravmahato348. </script> |
Output
1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7
Time Complexity: O(m * n)
Space Complexity: O(m * n)