Для выполнения прохождения по спирали в матрице, можно использовать алгоритм, основанный на движении по краям матрицы внутрь.
Для начала, нужно определить границы матрицы: верхнюю, правую, нижнюю и левую. Затем, мы будем перемещаться по этим границам, постепенно сужая границы, пока не обойдем всю матрицу.
Первым шагом, инициализируем переменные для границ и текущего направления движения:
- верхняя граница: top = 0
- нижняя граница: bottom = количество строк - 1
- левая граница: left = 0
- правая граница: right = количество столбцов - 1
- текущее направление движения: direction = 0 (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх)
Затем начинаем выполнение цикла, пока верхняя граница меньше или равна нижней границе и левая граница меньше или равна правой границе:
- Перебираем элементы верхней границы, и каждый элемент помещаем в результирующий вектор.
- Увеличиваем верхнюю границу.
- Перебираем элементы правой границы, и каждый элемент помещаем в результирующий вектор.
- Уменьшаем правую границу.
- Проверяем условие, чтобы убедиться, что нижняя граница не стала меньше верхней границы.
Если условие выполнилось, переходим к следующему шагу, иначе завершаем цикл.
- Перебираем элементы нижней границы, и каждый элемент помещаем в результирующий вектор.
- Уменьшаем нижнюю границу.
- Перебираем элементы левой границы, и каждый элемент помещаем в результирующий вектор.
- Увеличиваем левую границу.
- Проверяем условие, чтобы убедиться, что правая граница не стала меньше левой границы.
Если условие выполнилось, переходим на шаг 1, иначе завершаем цикл.
После завершения цикла, в результирующем векторе будет содержаться последовательность элементов матрицы, образующих спиральный путь.
Пример реализации данного алгоритма на языке C++:
#include <iostream> #include <vector> std::vector<int> spiralOrder(std::vector<std::vector<int>>& matrix) { std::vector<int> result; if (matrix.empty()) { return result; } int top = 0; int bottom = matrix.size() - 1; int left = 0; int right = matrix[0].size() - 1; int direction = 0; while (top <= bottom && left <= right) { if (direction == 0) { // moving right for (int i = left; i <= right; i++) { result.push_back(matrix[top][i]); } top++; } else if (direction == 1) { // moving down for (int i = top; i <= bottom; i++) { result.push_back(matrix[i][right]); } right--; } else if (direction == 2) { // moving left for (int i = right; i >= left; i--) { result.push_back(matrix[bottom][i]); } bottom--; } else if (direction == 3) { // moving up for (int i = bottom; i >= top; i--) { result.push_back(matrix[i][left]); } left++; } direction = (direction + 1) % 4; // update direction } return result; } int main() { std::vector<std::vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; std::vector<int> result = spiralOrder(matrix); for (int num : result) { std::cout << num << " "; } return 0; }
В данном примере создается матрица размером 3x3 и значения заполняются числами от 1 до 9. Затем выполняется вызов функции spiralOrder
для данной матрицы, и результат выводится на экран.