java spiral matrix not working

125 views Asked by At

This is the code I made go throw the spiral matrix, but it go throw the the matrix differently

2000021 
1970022 
1860123
1714131224 
1600025

the code is it:

public class caracol {
   public static void main(String[] args) {
        int[][] matriz = new int[5][5];
        int n=5;
        int nlimite= n-1;
        int inicio = 0;
        int c=1;
        while(c<=(n*n)) {

            for (int i = inicio+2; i<=nlimite-1; i++) //baja
            {
                matriz[i][nlimite-1] = c++; 
            }

            for (int i = inicio+2; i>=inicio+1; i--) ///izquierda
            {
                matriz[nlimite-1][i] = c++;
            }

            for (int i = nlimite-1; i>=inicio+1; i--) //sube
            {
                matriz[i][inicio+1] = c++;
            }


            for (int i = inicio+1; i>=nlimite-1; i++) //derecha
            {
                matriz[inicio+1][i] = c++;
            }

            for (int i = inicio+1; i<=nlimite; i++) //baja
            {
                matriz[i][nlimite] = c++;
            }

            for (int i = nlimite-1; i>=inicio; i--) ///izquierda
            {
                matriz[nlimite-1][i] = c++;
            }

            for (int i = nlimite; i>=inicio; i--) //sube
            {
                matriz[i][inicio] = c++;
            }

            for (int i = inicio; i>=nlimite; i++) //derecha
            {
                matriz[inicio][i] = c++;
            }  

            for (int i = inicio; i<=nlimite; i++) //baja
            {
                matriz[i][nlimite] = c++;
            }
            nlimite=nlimite-1;
            inicio = inicio+1;
        }
        for(int x=0;x<n;x++) { /*Mostrar la matriz en pantalla*/
            System.out.println();
            for(int y=0;y<n;y++) {
                System.out.print(matriz[x][y]);
            }
        }
    }
}

the resulting matrix is different compared to the matrix of the photo. you must start in matrix [2] [2], but it does in matrix [0] [0], as you change the position of the index of the row and column.

1

There are 1 answers

3
Usagi Miyamoto On BEST ANSWER

Try something like this:

public class Matrix
{
    // holds the matrix
    private int[][] matrix = new int[ 5 ][ 5 ];
    // fills up the matrix with zeroes   
    public void init()
    {
        for ( int i = 0; i < 5; ++i )
            Arrays.fill( matrix[i], 0 );
    }
    // prints the matrix out
    public void print()
    {
        for ( int i = 0; i < 5; ++i )
        {
            for ( int j = 0; j < 5; ++j )
                System.out.printf( "%3d", matrix[i][j] );
            System.out.println();
        }
    }
    // prints text out according to the matrix
    public void print(String text)
    {
        for ( int i = 0; i < 5; ++i )
        {
            for ( int j = 0; j < 5; ++j )
                System.out.print( text.charAt(matrix[i][j]) );
            System.out.println();
        }
    }
    // fills the matrix with the spiral
    public void generate()
    {
        // variables: co-ordinates, value, direction
        int x = 2, y = 2, val = 0, dir = 0;
        // in a 5×5 matrix we should put in 25 values...
        while ( val < 25 )
        {
            // put this value
            matrix[y][x] = ++val;
            // for debugging
            System.out.printf( "val=%d, x=%d, y=%d, dir=%d%n", val, x, y, dir );
            // calculate next value's position, and check if we must turn
            int turn = -1;
            switch ( dir )
            {
                case 0: // down, checking left
                    ++y;
                    if ( 25 != val ) // the last value would cause error
                        turn = matrix[y][x - 1];
                    break;
                case 1: // left, checking up
                    --x;
                    turn = matrix[y - 1][x];
                    break;
                case 2: // up, checking right
                    --y;
                    turn = matrix[y][x + 1];
                    break;
                case 3: // right, checking down
                    ++x;
                    turn = matrix[y + 1][x];
            }
            // next direction
            if ( 0 == turn )
                dir = ( dir + 1 ) & 3;
        }
    }
    // for testing
    public static void main( String[] args )
    {
        final Matrix m = new Matrix();
        m.init();
        m.generate();
        m.print();
        m.print("HelloWorldTodayIsAGoodDay");
    }
}

Will output:

val=1, x=2, y=2, dir=0
val=2, x=2, y=3, dir=1
val=3, x=1, y=3, dir=2
val=4, x=1, y=2, dir=2
val=5, x=1, y=1, dir=3
val=6, x=2, y=1, dir=3
val=7, x=3, y=1, dir=0
val=8, x=3, y=2, dir=0
val=9, x=3, y=3, dir=0
val=10, x=3, y=4, dir=1
val=11, x=2, y=4, dir=1
val=12, x=1, y=4, dir=1
val=13, x=0, y=4, dir=2
val=14, x=0, y=3, dir=2
val=15, x=0, y=2, dir=2
val=16, x=0, y=1, dir=2
val=17, x=0, y=0, dir=3
val=18, x=1, y=0, dir=3
val=19, x=2, y=0, dir=3
val=20, x=3, y=0, dir=3
val=21, x=4, y=0, dir=0
val=22, x=4, y=1, dir=0
val=23, x=4, y=2, dir=0
val=24, x=4, y=3, dir=0
val=25, x=4, y=4, dir=0
 17 18 19 20 21
 16  5  6  7 22
 15  4  1  8 23
 14  3  2  9 24
 13 12 11 10 25
sAGoo
IoWod
ylHrD
alela
doTdy

Edit: Added text as per Me Myself requested