- Tema primero
Problema del laberinto
entrar
La entrada contiene varios conjuntos de datos de prueba. La primera línea de entrada es un número entero T, lo que significa que hay T grupos de datos de prueba.
La primera línea de cada entrada son dos números enteros N y M (1 <= N, M <= 100).
En las siguientes N líneas, ingrese M caracteres en cada línea, y cada carácter representa un pequeño cuadrado en el laberinto.
Los significados de los caracteres son los siguientes:
'S': punto de inicio 'E': punto
final'- ':
espacio abierto, que puede atravesar
' # ': obstáculo, no se puede pasar. Se
garantiza que los datos de entrada tienen un solo punto de inicio y un punto final.
Salida
Salida
Para cada grupo de entradas, envíe la distancia más corta desde el punto de inicio al punto final. Si no hay forma desde el punto de inicio al punto final, la salida -1.
Muestra
entrar
Salida
9
Ideas e ilustraciones para la resolución de problemas
Al principio sentí que se podían usar tanto las pilas como las colas, ¡pero luego descubrí el problema después de un estudio cuidadoso !
- Supongamos aquí que la dirección de la búsqueda de nuestro camino es superior derecha, inferior izquierda
Diagrama de pila
Visite secuencialmente en el orden de búsqueda de ruta y empuje a la pila si se cumplen las condiciones
Código
#include<bits/stdc++.h>
#define ll long long
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
char mapp[105][105];
//char test[5][5] = { {'S','-','#','#','#'},{'-','-','-','-','-'},{'#','#','-','-','-',},{'E','#','-','-','-',},{'-','-','-','#','#',} };
int dex[4] = {
-1,0,1,0 };
int dey[4] = {
0,1,0,-1 };
int book[105][105] = {
0 };
typedef struct
{
int x, y, step;
}Position;
void maze(Position start, Position end, int n, int m) {
stack<Position> mystack;
start.step = 0;
mystack.push(start);
book[start.x][start.y] = 1;
Position temp = start;
while (!mystack.empty())
{
Position temp2 = mystack.top();
mystack.pop();
if (temp2.x == end.x && temp2.y == end.y) {
cout << temp2.step << endl;
return;
}
for (int i = 0; i < 4; i++) {
int dexs = temp2.x + dex[i];
int deys = temp2.y + dey[i];
if (dexs >= 0 && dexs < n && deys >= 0 && deys < m && !book[dexs][deys] && mapp[dexs][deys] != '#') {
temp.x = dexs;
temp.y = deys;
book[dexs][deys] = 1;
temp.step = temp2.step + 1;
mystack.push(temp);
}
}
}
cout << -1 << endl;
}
int main() {
int T;
Position start;
Position end;
int n, m;
while (cin >> T)
{
while (T--) {
mst(book);
mst(mapp);
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> mapp[i][j];
if (mapp[i][j] == 'S') {
start = {
i,j };
}
else if (mapp[i][j] == 'E') {
end = {
i,j };
}
}
}
maze(start, end, n, m);
}
}
return 0;
}
Diagrama de cola
Código
#include<bits/stdc++.h>
#define ll long long
#define mst(a) memset(a,0,sizeof(a))
using namespace std;
char mapp[105][105];
//char test[5][5] = { {'S','-','#','#','#'},{'-','-','-','-','-'},{'#','#','-','-','-',},{'E','#','-','-','-',},{'-','-','-','#','#',} };
int dex[4] = {
-1,0,1,0 };
int dey[4] = {
0,1,0,-1 };
int book[105][105] = {
0 };
typedef struct
{
int x, y, step;
}Position;
void maze(Position start, Position end, int n, int m) {
queue<Position> mystack;
start.step = 0;
mystack.push(start);
book[start.x][start.y] = 1;
Position temp = start;
while (!mystack.empty())
{
Position temp2 = mystack.front();
mystack.pop();
if (temp2.x == end.x && temp2.y == end.y) {
cout << temp2.step << endl;
return;
}
for (int i = 0; i < 4; i++) {
int dexs = temp2.x + dex[i];
int deys = temp2.y + dey[i];
if (dexs >= 0 && dexs < n && deys >= 0 && deys < m && !book[dexs][deys] && mapp[dexs][deys] != '#') {
temp.x = dexs;
temp.y = deys;
book[dexs][deys] = 1;
temp.step = temp2.step + 1;
mystack.push(temp);
}
}
}
cout << -1 << endl;
}
int main() {
int T;
Position start;
Position end;
int n, m;
while (cin >> T)
{
while (T--) {
mst(book);
mst(mapp);
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> mapp[i][j];
if (mapp[i][j] == 'S') {
start = {
i,j };
}
else if (mapp[i][j] == 'E') {
end = {
i,j };
}
}
}
maze(start, end, n, m);
}
}
return 0;
}
diferencia
Aunque solo se han
cambiado la declaración de cola y pila y el método de tomar el elemento superior del contenedor , el cambio es terrible
Aquí quiero agradecer al jefe de tx por sacrificar tiempo y estudiar conmigo.