Raccoon
Raccoon

Reputation: 67

Traversal matrix in "circle"

I don’t know how to go through elements in array in special order. Input array look like this: input matrix

And I need to go like this

way to go

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

Answers (1)

meowgoesthedog
meowgoesthedog

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:

  • Replace the 2 in 2 - i with N - 1 (inner loop, left / top)
  • Replace the 6 in 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

Related Questions