Подтвердить что ты не робот

Как обнаружить квадраты на сетке, которые НИКОГДА не могут быть частью кратчайшего пути после добавления блоков?

У меня есть сетка с началом, концом и некоторыми стенами. Единицы занимают самый короткий путь (перемещение только вверх/вниз/влево/вправо) от начала до конца, не проходя через стены.

shortest path

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

adding walls

Однако обратите внимание, что независимо от того, сколько стен добавлено или где они добавлены, есть некоторые квадраты, которые могут никогда быть частью кратчайшего пути!

These squares can never be part of the shortest path!
Эти квадраты никогда не могут быть частью кратчайшего пути!

Я ищу способ определить, какие квадраты никогда не могут быть частью кратчайшего пути.


Вышеприведенные случаи достаточно легко найти; но есть более сложные случаи. Рассмотрим:

None of the squares with red-dots can ever be part of the best-path

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

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

4b9b3361

Ответ 1

Рассмотрим любой путь от S до F. Этот путь может быть кратчайшим (если вы удаляете каждый другой квадрат), если вы не можете использовать "ярлыки", используя только те плитки. Это происходит только тогда, когда у вас есть два смежных квадрата, которые не смежны в пути. Поэтому вам нужно рассмотреть все пары смежных квадратов; все, что они отключают от S или F (без отключения S от F), не может быть частью кратчайшего пути. Кроме того, плитки, которые могут быть отключены одним квадратом, не могут быть частью какого-либо пути (который не повторяет вершин) от S до F, поэтому им тоже нужно идти.

Пусть N - число квадратов в сетке. Для любой конкретной пары квадратов (из них O (N)), то, что отключается, может быть вычислено в O (N) раз с наводнением, так что это O (N ^ 2). Это дешевле, чем min-cut, о чем вы говорили, пытаясь, поэтому я считаю его достаточно дешевым для вас.

Ответ 2

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

см. пример в вашем примере, это две желтые сетки, которые блокируют точки.

enter image description here

заблокированный одной сеткой, легко понять. При блокировке двумя:

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

Итак, вот алгоритм:

перечислить каждую пустую сетку

  • наденьте на него стену и используйте заливку заливом, чтобы найти заблокированные участки, они бесполезны.
  • попробуйте поместить стену на одну из них на четыре соседние сетки (если они пусты), используйте наводнение, чтобы найти заблокированные области, они бесполезны.