Обходная матрица в «круге» - PullRequest
0 голосов
/ 17 мая 2018

Я не знаю, как просматривать элементы в массиве в особом порядке. Входной массив выглядит так: input matrix

И мне нужно идти вот так

way to go

Единственный способ, которым я пришел, - это какая-то грубая сила:

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

Выглядит неплохо, если он 9х9, но если он будет больше, то даже при массиве 10х10 «колец» будет 16. Можно ли пройти матрицу в стиле круга, не касаясь угловых элементов? По часовой стрелке или против часовой стрелки не имеет значения, с какого круга начинать, также не имеет значения.

1 Ответ

0 голосов
/ 17 мая 2018

Обратите внимание, что каждая из 4 сторон каждого кольца имеет инвариантный индекс и преобразуется в 4 цикла for:

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];
}

Обобщение по размеру сетки N:

  • Замените 2 в 2 - i на N - 1 (внутренний цикл, левый / верхний)
  • Замените 6 в 6 + i на 2 * N (внутренний цикл, правый / нижний)

Код:

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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...