Извините, если это дубликат какого-либо потока, но я действительно не знаю, как описать вопрос.
Мне интересно, какова минимальная структура данных , чтобы предотвратить2D-сетка путешественника от повторения (то есть до того момента, когда она уже путешествовала) .Путешественник может двигаться только горизонтально или вертикально на 1 шаг каждый раз.Для моего особого случая (ниже) 2D-сетка на самом деле представляет собой нижний левый треугольник , где одна координата никогда не превышает другую.
Например, в случае 1D это можно сделать простозаписав направление последнего путешествия.Если направление изменяется, оно повторяется.
Для 2D-случая это становится сложным. Самым тривиальным способом было бы создание списка, записывающего пройденные ранее точки, но мне интересно, есть ли более эффективные способы сделать это?
Я реализую более или менееменьше алгоритма «4 пальца» для 4-суммы , где 2 пальца в середине движутся в двух направлениях (а именно i
, j
, k
и l
):
i=> <=j=> <=k=> <=l
1 2 3 ... 71 72 ... 123 124 ... 201 202 203
Направление движения пальцев определяется (или предлагается) некоторым алгоритмом, но может привести к бесконечной петле.Поэтому я вынужден не принимать никаких предложений, если два пальца посередине начинают повторять историческую позицию.
РЕДАКТИРОВАТЬ
За эти дни я нашел 2 решения.Ни один из них не является идеальным решением этой проблемы, но они, по крайней мере, несколько пригодны для использования:
Как упомянуто ниже @Sorin, одним из решений было бы сохранение массива битов, представляющего состояние всех ячеек.,Для примера с треугольной сеткой мы можем даже сжать массив, чтобы сократить стоимость памяти вдвое (хотя для вычисления позиции бита требуется k^2
время, где k
- степень свободы, то есть 2 здесь. Стандартный массив будет использоватьтолько линейное время).
Другим решением было бы прямое избегание путешествия назад.Настройте алгоритм так, чтобы j
и k
двигались только в одном направлении (это, вероятно, жадно).
Но все же, поскольку путешественник по 2D-сетке обладает хорошим свойством, чтоон перемещается вдоль оси 1 шаг каждый раз, мне интересно, есть ли более "специализированное" представление для этого вида движения.
Спасибо за вашу помощь!