- Tópico primeiro
Problema de labirinto
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
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
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
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 -