C ++: ejemplo básico de Guangsou: relleno de color

Primer ejemplo de búsqueda de amplitud: color de relleno

1. Título

Rockwell P1162

Título Descripción En
la matriz cuadrada compuesta por el número 0, hay un círculo cerrado de cualquier forma, el círculo cerrado está compuesto por el número 1. Al encerrar el círculo, solo sube, baja, izquierda y derecha. Ahora se requiere completar todos los espacios en el círculo cerrado como 2. Por ejemplo: matriz cuadrada de 6 × 6 (n = 6), la matriz cuadrada antes y después de pintar es la siguiente:
Antes de llenar
Después de llenar
Formato de entrada La
primera línea de cada grupo de datos de prueba es un número entero (1≤n≤30) , las
siguientes n líneas, Una matriz cuadrada n × n compuesta por 0 y 1 .
Solo hay un círculo cerrado en la matriz cuadrada y hay al menos un 0 en el círculo.
Formato de salida
Se ha completado la matriz cuadrada completa del número 22.

entrar

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

Salida

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

2. Solución de problemas

El código fuente es el siguiente:

#include <iostream>
using namespace std;
int a[32][32], b[32][32];
int dx[5] = {
    
     0,-1,1,0,0 };
int dy[5] = {
    
     0,0,0,-1,1 };
int n, i, j;
void dfs(int p, int q) {
    
    
	int i;
	if (p<0 || p>n + 1 || q<0 || q>n + 1 || b[p][q] != 0) 
		return;
	b[p][q] = 1;
	for (i = 1; i <= 4; i++) 
		dfs(p + dx[i], q + dy[i]);
}
int main() {
    
    
	cin >> n;
	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++) {
    
    
			cin >> a[i][j];
			if (a[i][j] == 0) 
				b[i][j] = 0;
			else b[i][j] = 1;
		}
	dfs(0, 0);
	for (i = 1; i <= n; i++) {
    
    
		for (j = 1; j <= n; j++)
			if (b[i][j] == 0) 
				cout << 2 << ' ';
			else 
				cout << a[i][j] << ' ';
		cout << '\n';
	}
}

Guía de ideas:
debería ser fácil ver que se trata de un problema básico de búsqueda de amplitud primero, que es BFS. La esencia del problema es separar los valores dentro de la pared . En cuanto a la pared y el exterior, podemos simplemente mostrarlo de acuerdo con el original. Primero, almacenamos los datos de la matriz bidimensional en la matriz bidimensional a. Una cosa a tener en cuenta es que no puede comenzar a guardar desde (0,0). Si comienza a guardar desde (0,0), aparecerá cuando se realice la búsqueda más tarde. Para el problema de la matriz fuera de límites, se define otra matriz b para representar el estado de cada elemento de nuestra imagen 01. Si la posición correspondiente a a es una pared, la posición correspondiente de b se colorea como 1, de lo contrario, se colorea como 0.

	for (i = 1; i <= n; i++)
		for (j = 1; j <= n; j++) {
    
    
			cin >> a[i][j];
			if (a[i][j] == 0) 
				b[i][j] = 0;
			else b[i][j] = 1;
		}

Luego comience desde (0,0), comience la búsqueda transversal y regrese solo si encuentra una pared o alcanza el límite de la matriz.

if (p<0 || p>n + 1 || q<0 || q>n + 1 || b[p][q] != 0) 
		return;

Si no regresa, es decir, la posición correspondiente al valor de la matriz a es 0, es decir, no es una pared y no está dentro de la pared, y luego esta posición se colorea, de hecho, la posición fuera de la pared también se cambia a una pared. Este paso es muy coloreado Importante, si no hay color, después de ingresar a la siguiente posición, cuando el programa se desplaza hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha, no hay ningún signo que indique si la posición anterior del programa se ha recorrido, y el programa volverá a ingresar a la posición recorrida anteriormente. Eso es de vuelta a (0,0), que también es el problema que mi compañero de clase encontró antes, y no puedo salir de la función.

void dfs(int p, int q) {
    
    
	int i;
	if (p<0 || p>n + 1 || q<0 || q>n + 1 || b[p][q] != 0) 
		return;
	b[p][q] = 1;
	for (i = 1; i <= 4; i++) 
		dfs(p + dx[i], q + dy[i]);
}

El siguiente es el paso anterior. Después de teñir la posición inicial, recorremos hacia arriba y hacia abajo (a través de dos matrices) en cuatro direcciones. Cada vez que atravesamos una dirección, es equivalente a saltar a la función bfs de una posición nuevamente, de forma recursiva , Hasta que todas las posiciones que no sean de pared se atraviesen y coloreen, y se cambien a paredes.
En este momento, en la matriz b, a excepción de la posición del punto 0, las otras posiciones se cambian a la pared, es decir, a excepción de la posición dentro de la pared, las otras posiciones son todas 1, luego se resuelve el problema, la salida:

for (i = 1; i <= n; i++) {
    
    
		for (j = 1; j <= n; j++)
			if (b[i][j] == 0) 
				cout << 2 << ' ';
			else 
				cout << a[i][j] << ' ';
		cout << '\n';
	}

3. Resumen

En general, la pregunta es una pregunta de búsqueda amplia basada en comparaciones, y lo más importante es definir otra matriz para reproducir la matriz original, colorear la matriz y distinguir dónde se debe cambiar el valor.
Para aquellos que no necesitan ser cambiados, genere la salida como está de acuerdo con la matriz a, y para aquellos que necesitan cambiarse, a través de la identificación y el juicio de la matriz b, genere el valor correspondiente requerido por la pregunta, y estará completo.
El tema en sí no es demasiado difícil, espero que pueda ayudar a los estudiantes que están a punto de aprender la búsqueda de amplitud, ¡gracias por navegar!

Supongo que te gusta

Origin blog.csdn.net/qq_19265749/article/details/103124250
Recomendado
Clasificación