Daniele - 1 year ago 171
Java Question

# algorithm to generate a spiral matrix in java

Write a class that, given a positive integer N, creates and returns a square matrix NxN made out of integers that displays the numbers from 1 to n^2 in a spiral

In my class I got four methods, three of them are for the direction, while the
`spiral()`
method should put every number in the right spot

``````public static int[][] spiral(int n) {
int[][] res;
int i,j;
int num;
int direction;

/** variables initializzazion */
res=new int[n][n];
i=0;
j=0;
res[i][j]=1;
direction=0;

for(num=2; num<=n*n; num++) {
direction = updateDirection(direction, i, j, n);
if ((direction==1) || (direction==3))
i=updateRow(i, direction);
else
j=updateColoumn(j, direction);
res[i][j]=num;
}
return res;
}
``````

Sadly, when I try to run it I get an
`ArrayIndexOutOfBoundException`
that seems to be caused by the
`res[i][j]=1;`
.

How can I fix it so that the Array still starts from 1 and goes up to N*N?

`updateDirection()`
method

to better understand this method have a look at this image:

``````public static int updateDirection(int direction, int i, int j, int n) {

/** if on the secondary diagonal direction is 1 or 3 */
if(i+j==n-1)
direction++;
/** if on the lower half of the main diagonal, direction is 2 */
if(i==j && j+j>=n)
direction++;
/** if on the row below the higher half of the main diagonal, direction is 0 */
if(i==j+1 && i+j<n)
direction++;
/** in other cases, direction doesn't change */

return direction%4;
}
``````

Edit2: This is my test method:

``````public static void testSpiral(){
for(int n=0; n<=5; n++)
System.out.println(Arrays.deepToString(spiral(n)));
}
``````

Edit3:
`updateRow()`
and
`updateColoumn()`

``````public static int updateRow(int i, int direction) {
int res;
if(direction==1)
res=i+1; //moves from top to bottom
else
res = i-1; //moves from bottom to top
return res;
}

public static int updateColoumn(int j, int direction){
int res;
if(direction==0)
res=j+1; //moves from left to right
else
res=j-1; //moves from right to left
return res;
``````

In `testSpiral` method you are starting the `for` loop in `0`, so the array `res` is created with size `0`.
When you try to set `res[i][j] = 1` you are trying to access the first element in the array but there is none.
Just start the `for` in `i=1`:
``````public static void testSpiral(){