Вот фрагмент из программы Java для выполнения спирального посещения матрицы.Он отслеживает изменения в направлениях, чтобы определить, сколько еще посещений нужно совершить, путешествуя в любом направлении.Модель, которая упрощает эту проблему, заключается в том, что при путешествии в любом заданном направлении при следующем посещении этого направления количество посещений уменьшается на единицу.Проще говоря, если при первом путешествии в горизонтальном направлении вы будете делать 6 посещений, то при следующем путешествии в горизонтальном направлении вы совершите 5 посещений.Следует также отметить, что горизонтальные и вертикальные посещения отслеживаются отдельно.Единственное уравнение, приведенное ниже, использовалось для расчета количества посещений для данного направления после необходимости изменения направления.Это уравнение выбирает вертикальное или горизонтальное, выводя его из общего числа изменений направления и используя mod в качестве селектора.Наконец, рассматривая посещения как змею, движущуюся по матрице, я представлял шаг как изменение строки / столбца как скорость (dy и dx).Как отметил другой человек, есть образец, который можно использовать и выраженный в формуле для dy и dx.
int[][] matrix = { { 1, 2, 3, 4, 5, 6, 7, 8 },
{ 24, 25, 26, 27, 28, 29, 30, 9 },
{ 23, 40, 41, 42, 43, 44, 31, 10 },
{ 22, 39, 48, 47, 46, 45, 32, 11 },
{ 21, 38, 37, 36, 35, 34, 33, 12 },
{ 20, 19, 18, 17, 16, 15, 14, 13 } };
int n = matrix.length;
int m = matrix[0].length;
int row = 0;
int col = 0;
int dx = 1;
int dy = 0;
int dirChanges = 0;
int visits = m;
for (int i = 0; i < n * m; i++) {
System.out.print(matrix[row][col] + " ");
visits--;
if (visits == 0) {
visits = m * (dirChanges %2) + n * ((dirChanges + 1) %2) - (dirChanges/2 - 1);
int temp = dx;
dx = -dy;
dy = temp;
dirChanges++;
}
col += dx;
row += dy;
}
Вывод этой программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2829 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48