acción Libia (amplia búsqueda, laberinto)

Desde el 16 de marzo del 2011, la escalada de disturbios en Libia, ha poner en grave peligro la seguridad del público en general y el personal nacional que trabaja en Libia. Con el fin de rescatar a nuestros compatriotas en Libia tan pronto como sea posible, ya que la situación en Libia, el gobierno chino le dijo a todos los ciudadanos en Libia, ¿qué medida puede el más rápido para llegar a un lugar seguro, y luego por el país envió aviones, barcos, coches y luego volver a casa. Supongamos mapa de Libia puede ser descrito como un rectangular n filas y m columnas, que se guarda en un pequeño Un compañero de fila en una ubicación segura de la diana en el extremo N filas por m columnas. Una pequeña lata solamente a una adyacente, inferior, izquierda, y direcciones correctas, es decir, si la posición presente es pequeña Una fila i y la columna j, el siguiente paso será llegar a la posición de la pequeña Una fila i-1 y j columnas, i + 1 fila j-ésima columna de la columna, fila i j-1, una de estas cuatro posiciones i + j columnas de fila. 1, por supuesto, no se puede mover una pequeña rectangular n filas y m columnas. Libia es un terreno multi-desierto y complejo país, algunos lugares son muy peligrosos, la gente no puede ir. Libia dada mapa, por favor venga a finales Díselo a un pequeño (n, m) desde el punto de partida (1,1) la cantidad de pasos que necesita el más rápido?

Formatos de entrada:

La primera línea tiene dos enteros positivos n, m (1≤n≤2000,1≤m≤2000), con un espacio entre ellos, topográficamente dividido Libia representa n filas y m columnas. Siguientes n líneas de m caracteres indican la información de ubicación en un mapa. En donde: el carácter "* " indica que esta posición es edificios, ríos, minas y otras personas no pueden venir a la ubicación (para asegurar que el punto de partida no es el final "* '); un punto decimal se puede llegar a esa posición.'."

Los formatos de salida:

Sólo una fila que sólo un número entero positivo. Una pequeña representación de principio a fin, la cantidad de pasos a las necesidades de más rápido.

de entrada de la muestra:

3 5
.*...
...*.
*..*.

Resultado de muestra:

8

 

 

 

Solía ​​escribir clase laberinto de temas a menudo tienen que depurar una variedad de errores y el método cada vez con un poco de diferencia, no uniforme, a menudo haciendo haciendo, encontró que de esta manera habrá algunas de las áreas más problemáticas. Parece ser pensado antes porque el código que conforma directamente comenzó, causando todo tipo de dolores de cabeza (miedo), esta vez casi directamente libres de error, de un solo paso, y la eficiencia y el código es ideal también, de modo Guarde este código como una clase de laberinto plantilla

ideas,

1. En primer lugar, la construcción de una estructura de coordenadas, no son las coordenadas x, puntos de Y y el número de pasos de las coordenadas de la llegada, y el constructor, la asignación a más tarde fácilmente.

2. Escribir la anchura de la trama de búsqueda, incluyendo las definiciones variedad bandera visitada, una serie de desplazamientos horizontal y vertical

3. Escribir un cheque función comprueba si las coordenadas de los puntos añadidos a la cola (comprobar fuera de los límites, si se trata de un obstáculo, y si visitó a)

#include<iostream>
#include<queue>
using namespace std;
struct pos {
	int x,y,cunt;
	pos(int a,int b,int c) {   //构造函数
		x=a;
		y=b;
		cunt=c;
	}
};
char a[2002][2002];
int n,m,z[4]= {0,0,1,-1},h[4]= {1,-1,0,0};
bool flag[2002][2002]= {false};
bool check(int x,int y) { //检查其是否越界,是否为障碍物,以及是否访问过了
	if(x>=0&&x<n&&y>=0&&y<m) {
		if(flag[x][y]==false) {
			if(a[x][y]=='.')return true;
		}
	}
	return false;
}
int bfs() {
	queue<pos> q;
	q.push(pos(0,0,0));
	flag[0][0]=true;
	while(!q.empty()) {
		pos top =q.front();
		q.pop();
		if((top.x==n-1)&&(top.y)==m-1)return top.cunt;
		for(int i=0; i<4; i++) {
			int x=top.x+z[i];
			int y=top.y+h[i];
			int cunt=top.cunt+1; //定义局部变量x,y,cunt,优于宏定义,可以增加运行速度
			if(check(x,y)) {     //因为x,y需要用到多次
				q.push(pos(x,y,cunt));
				flag[x][y]=true;
			}
		}
	}
	return -1; //无法到达终点
}
int main() {
	cin>>n>>m;
	for(int i=0; i<n; i++)cin>>a[i];
	cout<<bfs();
	return 0;
}

 

Publicado 42 artículos originales · alabanza ganado 16 · vistas 3409

Supongo que te gusta

Origin blog.csdn.net/qq_41542638/article/details/96346900
Recomendado
Clasificación