Problema de labirinto gráfico simples (c ++)

  • Tópico primeiro

entrar

A entrada contém vários conjuntos de dados de teste. A primeira linha de entrada é um inteiro T, o que significa que há T grupos de dados de teste.
A primeira linha de cada entrada é dois inteiros N e M (1 <= N, M <= 100).
Nas próximas N linhas, insira M caracteres em cada linha, e cada caractere representa um pequeno quadrado no labirinto.
Os significados dos caracteres são os seguintes:
'S': ponto inicial 'E': ponto
final'- ':
espaço aberto, que pode ser passado por
' # ': obstáculo, impossível de passar. Os
dados de entrada têm a garantia de ter um e apenas um ponto de partida e ponto final.
Resultado

Resultado

Para cada grupo de entradas, imprima a distância mais curta do ponto inicial ao ponto final. Se não houver caminho do ponto inicial ao ponto final, imprima -1.

Amostra

entrar

Insira a descrição da imagem aqui

Resultado

9

Ideias e ilustrações para a resolução de problemas

A princípio achei que tanto as pilhas quanto as filas poderiam ser usadas, mas depois descobri o problema após um estudo cuidadoso !

  • Aqui, suponha que a direção do nosso caminho para encontrar é superior direito, inferior esquerdo

Diagrama de pilha

Visite sequencialmente na ordem de localização do caminho e envie para a pilha se as condições forem atendidas

Insira a descrição da imagem aqui

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 fila

Insira a descrição da imagem aqui

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;
}

diferença

Embora apenas a declaração de fila e pilha e o método de obtenção do elemento superior do contêiner tenham sido
alterados, a mudança é terrível

Aqui, eu quero agradecer ao chefe tx por sacrificar tempo e estudar comigo -

Acho que você gosta

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