Saturday, September 8, 2012

Print a n*n matrix in spiral order

Print a n*n matrix in spiral order and what will be the consequences(if u use recursion) in case of larger matrices like 10000*10000

we can not use the recursion b'coz stack overflow may occur.
so we can not use the recursion !!!
cc to Arun Kumar Gupta !!

import java.util.*;
import java.lang.*;
public class MatrixWithRotation_In_Java
{
    public static void main (String [] args)
    {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(n+"\n");
       
        int [][] a = new int[n][n];
        String stat = "RR";
        int i=0 , j = 0 , el = 0 , c= 0 ,eu = 1 , cb = n-1 , rb = n-1 , change = 1 ;
        System.out.println("cb :"+cb+"\n");
        System.out.println("rb :"+rb+"\n");
        for(int k = 0 ; k<(n*n + 20) ; ++k)
        //while(a[i][j] == 0)
        {
            if(change == 1)
            {
            System.out.println(i+"\t" + j +"\n");
            ++c;
            a[i][j] = c;
            }
           
           
            if(stat.equals("RR"))   
            {
                System.out.println("RR\n");
                if(j+1<=cb)
                {
                change = 1;
                ++j;}   
               
                else
                {
                    stat = "CD";
                    --cb;   
                    change = 0;       
                }
            }
           
            if(stat.equals("CD"))   
            {
                System.out.println("CD\n");
                if(i+1<=rb)
                {
                ++i;
                change = 1;
                }   
                else
                {
                    stat = "RL";
                    --rb;   
                    change = 0;       
                }
            }
            if(stat.equals("RL"))   
            {
                System.out.println("RL\n");
                if(j-1>=el)
                {
                --j;
                change = 1;
                }   
                else
                {
                    stat = "CU";
                    change = 0;   
                    ++el;       
                }
            }
            if(stat.equals("CU"))   
            {
                System.out.println("CU\n");
                if((i-1>=eu) )
                {
                --i;
                change = 1;
                }   
                else
                {
                    stat = "RR";
                    ++eu;   
                    change = 0;   
                }
            }
           
        }
        for(int k = 0 ; k<n ; ++k)
        {
            for(int l = 0 ; l<n ; ++l)
            {
                System.out.print(a[k][l]+"\t");
            }
            System.out.print("\n");
        }
           
   
    }
}

4 comments:

Phani Krishna said...

Please post the algorithm for this so that people who want to implement it in multiple languages as per their requirements can also follow this. The most difficult thing in software industry is reading the code written by some one else

Unknown said...

there are 4 things RR = Row Right you can understand others like CU = Column Upper .
so i am starting from the a[0][0]
and this is the starting mode so ,
String stat = "RR";
we will move Row Right then we will reach to the end then condition will fail and stat = "CD" will be putted .
i have taken Change as a variable id change is == 1 then value will be putted .


System.out.println("cb :"+cb+"\n");
System.out.println("rb:"+rb+"\n");

for to check that system is working or not .

Concept is Too simple if you did't get still please let me know at mail@arungupta.co.in


Suman said...

private static int count = 0;

private static void spiralprint(String[][] array, int m, int n, int y) {

if (y == 0)
return;
if (y == 1) {
System.out.print(array[m][n]);
return;
}

int k;
int x = 1;
for (int j = 0; j < 4 && count < array.length * array.length; j++) {
k = y - 1;
switch (x) {
case 1:
while (k > 0) {
System.out.print(array[m][n++] + " ");
count++;
k--;
}
x++;
break;
case 2:
while (k > 0) {
System.out.print(array[m++][n] + " ");
count++;
k--;
}
x++;
break;
case 3:
while (k > 0) {
System.out.print(array[m][n--] + " ");
count++;
k--;
}
x++;
break;
case 4:
while (k > 0) {
System.out.print(array[m--][n] + " ");
count++;
k--;
}
break;
}
}
spiralprint(array, m + 1, n + 1, y - 2);
}

Suman said...

Method call : spiralPrint(array, 0, 0, array.length)

private static int count = 0;

private static void spiralprint(String[][] array, int m, int n, int y) {

if (y == 0)
return;
if (y == 1) {
System.out.print(array[m][n]);
return;
}

int k;
int x = 1;
for (int j = 0; j < 4 && count < array.length * array.length; j++) {
k = y - 1;
switch (x) {
case 1:
while (k > 0) {
System.out.print(array[m][n++] + " ");
count++;
k--;
}
x++;
break;
case 2:
while (k > 0) {
System.out.print(array[m++][n] + " ");
count++;
k--;
}
x++;
break;
case 3:
while (k > 0) {
System.out.print(array[m][n--] + " ");
count++;
k--;
}
x++;
break;
case 4:
while (k > 0) {
System.out.print(array[m--][n] + " ");
count++;
k--;
}
break;
}
}
spiralprint(array, m + 1, n + 1, y - 2);
}