Найти действительные узлы в сетке на основе диапазона X - PullRequest
0 голосов
/ 04 ноября 2011

У меня проблема с поиском N позиций в сетке на основе центральной точки и максимального диапазона.

У меня есть эта сетка, каждая координата в сетке может быть либо закрытой, либо открытой, япривязываю, используя открытую координату, нахожу все открытые координаты вокруг первой, которые действительны, и диапазон ходьбы между ними равен или меньше, чем максимальный диапазон ходьбы.

Сначала я попробовал решение, используяA *, где я выбрал бы каждую координату в диапазоне, проверил, были ли они действительными, если бы они были, я бы вызвал A * из них в центральное положение и посчитал количество шагов, если бы они были выше, чем мой максимальный диапазон, я бы простоудалить координату из моего списка.Конечно, это действительно медленно для диапазонов выше 3 или для сеток с несколькими координатами.Затем я попытался рекурсивно искать координаты, начиная с центральной, расширять и рекурсивно проверять правильность координат.Это решение оказалось наиболее эффективным, за исключением того, что в моем коде каждый вызов функции перепроверял уже проверенные координаты и возвращал повторяющиеся значения.Я думал, что мог бы просто разделить список «проверенных» между вызовами функций, но это просто сломало мой код, так как вызов проверял координату и закрывал ее, даже если у нее все еще были дочерние узлы, но технически они не находились в диапазоне их центра (но находились в пределах досягаемости первого центра) он закрыл бы их и дал бы странные результаты.

Наконец, мой вопрос: как мне это сделать?Мой подход неверен?Есть ли лучший способ сделать это?

Спасибо.

1 Ответ

1 голос
/ 05 ноября 2011

Я однажды реализовал нечто подобное.Простое рекурсивное решение, которое вы предложили, работало нормально для небольших диапазонов обхода, но время выполнения вышло из-под контроля для больших значений ...

Я улучшил это, реализовав вариант алгоритма Дейкстры, который хранит список посещенных узловкак вы сказали.Но вместо того, чтобы выполнять поиск по полному пути для каждой координаты в пределах досягаемости, как вы делали с A *, выполните первые N итераций алгоритма, если N - это ваш диапазон ходьбы (рисунок из Википедии может помочь вам понять, что я имею в виду).Ваш список посещенных узлов станет доступными плитками, которые вы ищете.

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

...