[Retroceso] B030_hdu1010_Tempter del hueso (problema de conectividad dfs + (paridad y paridad)

1. Título Descripción

Xiao Ming tuvo un sueño largo y largo. Cuando se despertó, se encontró a sí mismo y a sus amigos en un tablero de ajedrez en ruinas. Tenían que hacer todo lo posible para escapar de aquí.

Después de una larga exploración, Xiaoming descubrió que había un órgano en la cuadrícula del tablero donde estaba ubicado, que decía "Solo tienes una oportunidad, la puerta se abrirá en t segundos después de la salida", y el tablero donde está ubicado es N * El rectángulo de M puede moverse hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha (sin obstáculos). Hay una puerta en el tablero.

Según las indicaciones del gobierno, Xiao Ming comprendió de repente que él y su amigo deben llegar a la puerta en el segundo segundo. Y todo esto, ¡no hay vuelta atrás! Porque una vez que se mueve, el punto en el que estaba desaparecerá, y no puede permanecer en un punto por más de un segundo, de lo contrario la cuadrícula explotará.

La gran fuga ha comenzado, ¿pueden Xiaoming y sus amigos escapar con seguridad de este extraño tablero de ajedrez?

Entrada

Ingrese múltiples conjuntos de datos de prueba. La primera línea de cada caso de prueba contiene tres enteros N, M y T (1 <N, M <7; 0 <T <50), lo que indica el tamaño del tablero de ajedrez y el momento en que la puerta está abierta. Las siguientes N líneas dan el diseño del tablero, cada línea contiene M caracteres. Donde

  • ".": Punto sin barreras
    "X": Punto de obstáculo
    "S": Punto inicial
    "D": Puerta

La entrada termina con 3 ceros. Este caso de prueba no necesita ser procesado.

Salida

Se emite una línea para cada conjunto de muestras.
Si Xiaoming puede escapar de forma segura, escriba "SÍ", de lo contrario, escriba "NO".

Sample Input
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0

Sample Output
NO
YES

En segundo lugar, la solución

Método 1: búsqueda dfs

  • Los dfs regulares solo pueden obtener 30 puntos.
  • Poda pequeña: cuando reach = true, no hay necesidad de continuar buscando.
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
	static int N, M, T;
	static int sx, sy, ex, ey;
	static char[][] grid;
	final static int[][] dir = { {0,1},{0,-1},{1,0},{-1,0} };
	static boolean[][] vis;
	static boolean reach;
	
	static boolean inArea(int x, int y) {
		return x >= 0 && x < N && y >= 0 && y < M;
	}
	static void dfs(int x, int y, int t) {
		if (grid[x][y] == 'D') {
		    reach = t == T;
			return;
		}
		if (reach) return;
		for (int k = 0; k < 4; k++) {
			int tx = x + dir[k][0];
			int ty = y + dir[k][1];
			if (!inArea(tx, ty) || grid[tx][ty] == 'X' ||  vis[tx][ty])
			    continue;
			vis[tx][ty] = true;
			dfs(tx, ty, t+1);
			vis[tx][ty] = false;
		}
	}
    public static void main(String[] args) throws IOException {  
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
		while (true) {
			N = sc.nextInt();
			M = sc.nextInt();
			T = sc.nextInt();
			if (N == 0 && M == 0 && T == 0)
				break;
			vis = new boolean[N][M];
			grid = new char[N][M];
			for (int i = 0; i < N; i++) {
				String s = sc.next();
				for (int j = 0; j < M; j++) {
					grid[i][j] = s.charAt(j);
					if (grid[i][j] == 'S') {
					    sx = i; sy = j;
					} else if (grid[i][j] == 'D') {
					    ex = i; ey = j;
					}
				}
			}
			vis[sx][sy] = true;
			dfs(sx, sy, 0);
			System.out.println(reach ? "YES" : "NO");
			reach = false;
		}
    }
}

Lugares para podar:

  • Pre-poda : la posición actual (x, y), el número actual de pasos para ir, en comparación con: T-tmientras que la distancia más corta entre dos puntos, también conocido como la distancia Manhattan era abs(sx-ex) + abs(sy-ey), así que cuando T-t < abs(sx-ex) + abs(sy-ey)el tiempo de
    3 3 4
    S X X 
    . X X
    X . D     在这里n*m-obs = 3*3-5 = 4 = t,故不可达
    
  • Poda par e impar :

Análisis de complejidad.

  • Complejidad del tiempo: El ( 2 norte ) O (2 ^ n) , Nota: Los problemas de retroceso generalmente no son lineales en complejidad.
  • Complejidad espacial: El ( . . . ) El (...) ,

Método 2: bfs

Esta es una elección incorrecta, porque el bfs debe informar la ruta más corta, y la ruta más corta no es necesariamente el tiempo requerido T.


Blog de referencia: https://blog.csdn.net/nvliba/article/details/48532709, con imágenes y sin código
10 como
explicación de texto
Dirección de evaluación: https://vijos.org/d/orina_personal/p/5c4f2bf0f41362860e389f83

Publicado 714 artículos originales · elogiado 199 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/105595909
Recomendado
Clasificación