Problema gráfico de laberinto simple (c ++)

  • Tema primero

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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

Inserte la descripción de la imagen aquí

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.

Supongo que te gusta

Origin blog.csdn.net/qq_43477024/article/details/109659363
Recomendado
Clasificación