2012-09-13 19 views
13

Tengo una grilla con inicio, final y algunas paredes. Las unidades toman la ruta más corta (moviéndose solo hacia arriba/abajo/izquierda/derecha) desde el principio hasta el final, sin pasar por las paredes.¿Cómo detectar cuadrados en una cuadrícula que NUNCA puede ser parte de una ruta más corta después de agregar bloques?

shortest path

El usuario se le permite añadir tantas paredes adicionales, ya que quiere cambiar la ruta.

adding walls

Sin embargo, observe que se añaden, no importa cuántas paredes o dónde se añaden, hay algunas plazas que puede Nunca ser la parte del camino más corto!

These squares can never be part of the shortest path!
Estas plazas no pueden ser parte de la ruta más corta!

Estoy buscando una manera de detectar qué cuadrados nunca pueden ser parte de la ruta más corta.


Los casos anteriores son fáciles de encontrar; pero hay casos más complejos. Considere:

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

En la imagen anterior, ninguno de los cuadros con puntos rojos nunca puede ser parte de la mejor ruta, porque sólo hay una entrada a esa zona, y es sólo dos espacios de ancho. Si tuviera tres espacios de ancho, o si se eliminara alguna de las paredes, la mayoría de esos cuadrados podrían ser parte del mejor camino.

He estado tratando de encontrar una manera de detectar casos como el anterior (principalmente usando min-cuts y rellenos de inundación), pero sin éxito. ¿Alguien sabe de una manera de resolver este problema?

+1

Una característica común que comparten sus dos ejemplos es tener un [separador de clics] (http://en.wikipedia.org/wiki/Vertex_separator) de tamaño 1 o 2. ¿Puede pensar en un ejemplo en el que este no es el caso? – krjampani

+1

@jkraju, no he pensado en un ejemplo donde las células muertas (es decir, las células que no pueden formar parte de ninguna ruta más corta) no tienen separadores de tamaño 1 o 2; pero * es * fácil pensar en ejemplos con separadores de tamaño 2 para celdas no muertas. –

+0

@ jwpat7 Solo estaba considerando separadores que mantienen s y f en el mismo componente. Tal vez estabas pensando en separadores de 2 camarillas que separan a s de f? Estoy de acuerdo en que es fácil construir un ejemplo así. – krjampani

Respuesta

4

Considere cualquier ruta de S a F. Esa ruta podría ser una ruta más corta (si elimina todos los demás cuadrados) a menos que pueda tomar "accesos directos" usando solo esos mosaicos. Esto solo ocurre cuando tienes dos cuadrados adyacentes que no están adyacentes en la ruta. Entonces, debes considerar todos los pares de cuadrados adyacentes; cualquier cosa que desconecten de S o F (sin desconectar S de F) no puede formar parte del camino más corto. Además, las fichas que se pueden desconectar por un solo cuadrado no pueden formar parte de ninguna ruta (que no repita los vértices) de S a F, por lo que también deben ir.

Deje N ser el número de cuadrados en la cuadrícula. Para cualquier par particular de cuadrados (hay O (N) de ellos), lo que se desconecta se puede calcular en O (N) tiempo con un relleno, entonces esto es O (N^2). Que es más barato que min-cut, que mencionaste al intentarlo, así que supongo que es lo suficientemente barato para ti.

+1

Dang, estaba tan cerca de esta solución * (ver la respuesta de @Topro) *! Me gustan ambas respuestas, pero elegí esta por la prueba convincente de que no hay otros casos que considerar. Gracias a los dos: ahora lo he implementado y funciona muy bien. –

+0

buena manera de explicarlo. Mi respuesta es básicamente la misma técnica, pero intenta hacerlo en O (N); sin embargo, la implementación sería mucho más difícil. –

1

primero vemos que, las áreas pueden ser bloqueadas por una o dos cuadrículas adyacentes nunca estarán en la ruta más corta.

ver el caso en su ejemplo, son esas dos cuadrículas amarillas las que bloquean los puntos.

enter image description here

bloqueado por una rejilla es fácil de entender. Cuando bloqueado por dos:

  1. si no adyacente, podemos añadir paredes adicionales para que sea el único camino, ir en a través de uno y salir de la otra, por lo que es posible que tengamos los las interiores.
  2. si está adyacente, siempre podemos ir de uno directamente al otro, por lo que todavía no necesitamos las cuadrículas dentro de esa área.

Así que aquí hay viene el algoritmo:

enumerar cada cuadrícula vacía

  1. poner una pared en él y utilizar las inundaciones relleno para encontrar las áreas bloqueadas, que no sirven de nada.
  2. intente poner una pared en una de sus cuatro cuadrículas adyacentes (si está vacía), use relleno de inundación para encontrar las áreas bloqueadas, no sirven de nada.
+0

Hmm, creo que tienes razón con esto * (con la advertencia de que necesitamos inundar cuadrados individuales también, para encontrar cuadrados que comienzan inalcanzables. Además, solo debes verificar dos vecinos, no cuatro) *. Me estaba confundiendo todo este tiempo porque los cuadrados amarillos en tu imagen pueden ser parte del mejor camino, pero me di cuenta de que después de llenarnos de inundaciones, no consideramos las dos plazas en las que colocamos paredes como parte de ese inalcanzable zona. Do'h! –

Cuestiones relacionadas