Кажется, вы хотите найти ближайший путь между двумя точками A и B в сетке без каких-либо препятствий. Движение должно быть в одном из четырех основных направлений. Затем вы хотите удлинить этот путь до определенной длины.
Во-первых, если нет препятствий, вам не нужно прощупывать все направления. Например, если B находится в 4 шагах к востоку и в двух шагах к северу от A, просто выбирайте шаги из {E, E, E, E, N, N} случайным образом (или перетасовывайте массив) до тех пор, пока не прибудете.
Наименьшее расстояние d * между A и B - это манхэттенское расстояние:
d * = | Ax - Bx |+ | Ay - By |
Если вы представляете, что сетка окрашена как шахматная доска, расстояние между A и B будет четным, если оба цвета имеют одинаковый цвет, а в другом случае - нечетное. Это относится не только к наименьшему расстоянию, но и к расстоянию любого действительного пути между A и B. Следовательно, вы можете получить только расстояния d * + 2 · k.
Вы можете сделать более длинные пути с помощьюдобавив небольшие «объезды» к вашему идеальному пути:
· · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · B · · · · · · · B · · · · · · · B ·
· · · · ┌───┘ · · u · · ┌───┘ · · · · · ┌───┘ ·
· · · · │ · · · · ╒═╕ · └─╖ · · · · · ╔═╡ · · ·
· ┌─────┘ · · · · │ └─────╜ v · · ┌───╜ ╧ w · ·
· A · · · · · · · A · · · · · · · A · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · ·
Каждый из «вмятин» u и v добавляет два сегмента к вашему пути. Когда вы делаете вмятины, будьте осторожны, чтобы не сделать вмятину, где уже есть часть пути: у вмятины есть часть пути, свернутая на себя, так что есть тупик. Вы можете удалить тупик, но путь будет иметь ту же длину, что и раньше.
Как реализовать все это, оставлено в качестве упражнения для читателя. :)