Задача
Допустим, у меня есть (бесконечный) шестиугольный лист.Начиная с 1 шестиугольника, я могу перемещаться во все соседние, за исключением некоторых «полых» шестиугольников.Некоторые шестиугольники имеют вес 1, другие имеют один из 2. С максимальным весом x
, как получить все шестиугольники с совокупным весом из начального гекса ниже x
?
Context
Я пытаюсь сделать мод для игры Civilization V. В ней мне нужно получить набор всех плиток, на которые юнит может перейти за 10 ходов, зная этот юнит.имеет 1 очко движения за ход, и что каждая плитка, кроме дорог, стоит 1 MP, чтобы пройти (дороги стоят 0,5).Горные и морские плитки недоступны.В двух словах, это расширенная версия области, отображаемой вокруг выбранных юнитов, показывающая все тайлы на расстоянии 1-витка от юнита.
Текущие тесты
На данный момент я попробовал 2 решения, но ни одно из них не кажется очень эффективным.В большинстве моих попыток не удается узнать, какие листы проверять (либо потому, что они еще не проверены, либо потому, что они не проверены на кратчайший путь), а какие нет, и заканчивает проверку каждой плитки в пределах диапазона несколько раз иотклонение нескольких плиток, которые, по-видимому, находятся в пределах досягаемости, но были проверены с более длинного пути, чем необходимо, тем самым считая, что они слишком далеко.
- Первый был очень наивен и проверен рекурсивно для каждой плитки вокруг начальной плитки, исключив все плитки, которые имели совокупный вес, превышающий
x
. - Для второго решения я сохранил ту же структуру, но добавил фильтрацию условий, что плитку не следует отклонять, если расстояние от источникабыл ниже кумулятивного веса, рассчитанного для перехода туда (поскольку несколько путей с разными кумулятивными весами могут привести к одной и той же плитке).Но есть очень много случаев, когда это утверждение неверно.
Мне бы очень нужны были советы, как это сделать.
Спасибо, Méta