Ближайшее официальное название, которое я мог найти для описываемого вами алгоритма, - "Прямоугольный спиральный поиск" , который представляет собой алгоритм, который выводит путь, по которому следует полностью сканировать сетку по спирали. 1003 *
Простой алгоритм сканирования по часовой стрелке квадратной сетки размером (2N + 1) ^ 2, N> 0 будет выглядеть так:
(Предполагая, что координата (0,0) сетки находится в нижнем левом углу сетки)
- Начало в центральной ячейке сетки (N, N)
- Переместиться влево (-1,0) для следующей ячейки
- Установить направление движения вверх (0, + 1)
- Хотя текущая ячейка (X, Y) не является углом (то есть (X-N) ^ 2 == (Y-N) ^ 2), двигайтесь в заданном направлении
- Если текущая ячейка не в (0,0)
- Поверните направление по часовой стрелке
- (0, + 1) становится (+1,0)
- (+ 1,0) -> (0, -1)
- (0, -1) -> (-1,0)
- (- 1,0) -> (0, + 1))
- Один раз двигаться в новом направлении
- Перейти к шагу 4
- Если текущая ячейка (0,0), все готово
Для сеток (2N) ^ 2 и неквадратных необходимо настроить первые 3 шага.
Реализация для квадратных сеток доступна для Perl в объекте Spiral модуля Array-Tour.