Reputation: 67
I don’t know how to go through elements in array in special order. Input array look like this:
And I need to go like this
Only way I came to, is some sort of brute force:
int Rings[][] = new int [3][12];
for (int i = 0; i < 3; i++) {
Rings[i][0] = matrix[2-i][5];
Rings[i][1] = matrix[2-i][4];
Rings[i][2] = matrix[2-i][3];
Rings[i][3] = matrix[3][2-i];
Rings[i][4] = matrix[4][2-i];
Rings[i][5] = matrix[5][2-i];
Rings[i][6] = matrix[6+i][3];
Rings[i][7] = matrix[6+i][4];
Rings[i][8] = matrix[6+i][5];
Rings[i][9] = matrix[5][6+i];
Rings[i][10] = matrix[4][6+i];
Rings[i][11] = matrix[3][6+i];
}
//Rings[0] = 9,6,3,7,8,9,1,4,7,3,2,1
//Rings[1] = 8,5,2,4,5,6,2,5,8,6,5,4
//Rings[2] = 7,4,1,1,2,3,3,6,9,9,8,7
It’s look not too bad if it 9x9 but if it will be bigger, even with 10x10 array “Rings” will be 16. Is it possible to go through matrix in circle style without touching corner elements? Clockwise or counterclockwise doesn’t matter, with what circle to begin, doesn’t matter either.
Upvotes: 1
Views: 353
Reputation: 15035
Note that each of the 4 sides of every ring has an invariant index, and convert into 4 for-loops:
for (int i = 0; i < 3; i++)
{
int j = 0;
for (int k = 5; k > 2; k--)
Rings[i][j++] = matrix[2-i][k];
for (int k = 3; k < 6; k++)
Rings[i][j++] = matrix[k][2-i];
for (int k = 3; k < 6; k++)
Rings[i][j++] = matrix[6+i][k];
for (int k = 5; k > 2; k--)
Rings[i][j++] = matrix[6+i][k];
}
Generalizing to grid size N
:
2 - i
with N - 1
(inner loop, left / top)6 + i
with 2 * N
(inner loop, right / bottom)Code:
for (int i = 0; i < N; i++)
{
int j = 0;
for (int k = 2 * N - 1; k >= N; k--)
Rings[i][j++] = matrix[N - 1 - i][k];
for (int k = N; k < 2 * N; k++)
Rings[i][j++] = matrix[k][N - 1 - i];
for (int k = N; k < 2 * N; k++)
Rings[i][j++] = matrix[2 * N + i][k];
for (int k = 2 * N - 1; k >= N; k--)
Rings[i][j++] = matrix[2 * N + i][k];
}
Upvotes: 1