Printing an Array in Spiral Order !
Hello !
Once I had to write a code to print an N*N array in spiral order. Well it was a really thinkable process to get to the solution and this problem was also asked in Microsoft interviews. So here I go with the C# code to print an array in spiral order,
public void PrintInSpiral(int [][] numbers, int size)
{
for(int i = size – 1 , j = 0 ; i >= 0 ; i–, j++)
{
for(int k = j ; k < i; k++)
Console.Write(numbers[j][k]+ " ");
for(int k = j ; k < i; k++)
Console.Write(numbers[k][i]+ " ");
for(int k = i ; k > j; k–)
Console.Write(numbers[i][k]+ " ");
for(int k = i ; k > j; k–)
Console.Write(numbers[k][j]+ " ");
}
}
if the array has a rank of 4 and contains elements as follows.
1 , 2 , 3 , 4
5 , 6 , 7 , 8
9, 10 , 11, 12
13, 14, 15, 16
then the output should be 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10. So run the above code and do dry run it on any N*N array 🙂
Regards,
Haroon
Hi Haroon,
Will this code work fine for square matrix with odd size??? say for 3×3 matrix!!!
Please conform.
Thanks
can u tell if a matrix spirally can be printed if matrix is m * n
Hi sandeep
For odd size the code wont print the middle value(for ex:in 5*5.. a[2][2] value);
you can add this to print:
float i =ar.length%2;// For odd numbers
if (i!=0){
int k=(int)((ar.length-i)/2);
System.out.println(ar[k][k]);
}
Thanks
Naveen
Hmm the code is Wrong it’s not written in c#
for(int k = i ; k > j; k–)? it should be k–…etc wring code 🙂 sorry but if u kindly post ur correct code, or never do that 😉
It’s his crappy scripts that are changing double dash to a long dash instead.. your code looks wrong too.. Mathematicians make bad frontend developers.. people don’t get that..
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace Microsoft.SpiralBusted
{
class Program
{
#region SETUP ARRAY
public const int ROW_SIZE = 5;
public const int COLUMN_SIZE = 6;
static int[,] Array = new int[ROW_SIZE, COLUMN_SIZE]
{ {1, 2, 3, 4, 5, 6},
{7, 8, 9, 10, 11, 12},
{13, 14, 15, 16, 17, 18},
{19, 20, 21, 22, 23, 24},
{25, 26, 27, 28, 29, 30} };
#endregion
#region TRAVERSE FUNCTION
public static void Traverse(int m, int n, bool bGoingUP)
{
// print the current node ignore visited node
if (Array[m, n] != -1)
{
Console.Write(“{0} “, Convert.ToString(Array[m, n]));
}
// mark the current node as visited
Array[m, n] = -1;
// Recurse right
if ((n < COLUMN_SIZE-1) && (Array[m, n + 1] != -1) && !bGoingUP)
{
Traverse(m, n + 1, false);
return;
}
// Recurse down
if ((m 0) && (Array[m, n – 1] != -1) && !bGoingUP)
{
Traverse(m, n – 1, false);
return;
}
// Recurse up
// Note: without bGoingUp controller, it will traverse in zigzag style rather than spiral.
if ((m > 0) && (Array[m – 1, n] != -1))
{
Traverse(m – 1, n, true);
return;
}
// make another round till it’s finished
if ((m < ROW_SIZE – 1) && (n < COLUMN_SIZE – 1))
{
Traverse (m, n+1, false);
}
}
#endregion
#region MAIN
static void Main(string[] args)
{
Traverse(0, 0, false);
Console.ReadLine();
}
#endregion
}
}
Recursive solution…
-hkim
Depending where you start and how you order recursive calls, it can generate different patterns such as zig-zag… not just spiral.
-hkim
I try to work this program , but I contain exeption!
// Recurse down
if ((m (Don’t see) 0) && (Array[m, n – 1] != -1) && !bGoingUP)
{
Traverse(m, n – 1, false);
return;
}
Gm09KJ gkosir7v2bcakf8Gsbv420Vs
hi can u help me with the full code please…i need to wryt it in c++
Could this work in Java? I’m trying to create the same idea but in reverse order, please help?
It help me. Thank you a lot. 😉
@angel, I’ll show you hot it works in C++. I’ll be back with a post in 30 mins. 🙂
nice work , but can you translate this in pascal for me?
public void PrintInSpiral(int [][] numbers, int size)
{
for(int i = size – 1 , j = 0 ; i >= 0 ; i–, j++)
{
for(int k = j ; k < i; k++)
Console.Write(numbers[j][k]+ " ");
for(int k = j ; k j; k–)
Console.Write(numbers[i][k]+ ” “);
for(int k = i ; k > j; k–)
Console.Write(numbers[k][j]+ ” “);
}
}
Here is another approach to solve this problem.
It uses recursion to print the matrix
http://dev-interview-questions.blogspot.com/2009/03/print-2d-array-matrix-spiral-order.html
/*Here is the whole c++ code for this*/
#include
using namespace std;
void spiral_way(int Row_size,int Column_size,int a[][4])
{
int i,j,d,Current_row_size,Current_column_size;
int Counter=Row_size*Column_size;
Current_row_size =Row_size;
Current_column_size=Column_size;
d=0;
while(Counter>0) //Initailly my “Counter” is set to total no. of elemnet in my 2-D array. so now I will decrement it as I cover a element.
{
i=d;j=d;
while(j<Current_column_size) //this is for printing the first row in forward direction.
{
printf("%d\t",a[i][j]);
j++;
Counter–;
}
j–;i++;
while(i=d) //this is for printing the last row in backward direction.
{
printf(“%d\t”,a[i][j]);
j–;
Counter–;
}
i–;j++;
while(i>d) //this is for printing the first column in upward direction.
{
printf(“%d\t”,a[i][j]);
i–;
Counter–;
}
d++; //When I completed the outer rectangle I move in to inner rectangle by incrementing “d” .
Current_row_size–; //and decrementing the “Current_row_size” and “Current_column_size”.
Current_column_size–;
}
}
//————————-
int main()
{
int a[5][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16},
{17,18,19,20}
};
spiral_way(5,4,a);
system(“pause”);
return 0;
}
/*the right one…..*/
void spiral_way(int Row_size,int Column_size,int a[][4])
{
int i,j,d,Current_row_size,Current_column_size;
int Counter=Row_size*Column_size;
Current_row_size =Row_size;
Current_column_size=Column_size;
d=0;
while(Counter>0) //Initailly my “Counter” is set to total no. of elemnet in my 2-D array. so now I will decrement it as I cover a element.
{
i=d;j=d;
while(j<Current_column_size)//this is for printing the first row in forward direction.
{
printf("%d\t",a[i][j]);
j++;
Counter–;
}
j–;i++;
while(i=d)//this is for printing the last row in backward direction.
{
printf(“%d\t”,a[i][j]);
j–;
Counter–;
}
i–;j++;
while(i>d)//this is for printing the first column in upward direction.
{
printf(“%d\t”,a[i][j]);
i–;
Counter–;
}
d++; //When I completed the outer rectangle I move in to inner rectangle by incrementing “d” .
Current_row_size–;//and decrementing the “Current_row_size” and “Current_column_size”.
Current_column_size–;
}
}
Hi All,
I made some modification in the same function, to work on asymmetric metrics.
This code is in Java.
public static void PrintInSpiral(int [][] numbers, int row, int col)
{
int k=0,i=0,j=0,m=0;
for( i = col- 1, m=row-1 , j = 0 ; i >= 0&& m>=0 && j<(col-1) && j<(row-1) ;m–, j++,i–)
{
for( k = j ; k < i; k++)
System.out.print(numbers[j][k]+ " ");
for( k = j ; k j; k–)
System.out.print(numbers[m][k]+ ” “);
for( k = m ; k > j; k–)
System.out.print(numbers[k][j]+ ” “);
}
if(row==col&& row%2!=0){
k=(int)((row-1)/2);
System.out.print( numbers[k][k]);
}
System.out.println();
}
This prog. is not working. There are many syntax errors…. can u pls post a working program… wich is syntatically correct…..
You are READING spiral, and printing output in line. Unfortunately I need to print spiral, not line. I need output like:
from:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
to:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
So I need really PRINT spiral. 😦
plz give full code of this & properly
please give the code to accept numbers in a M*N matrix in spiral way
In blue j
are bleeding.