Resumen de la pregunta fuera del laberinto
Enlace al título original:
tema
Análisis del problema:
Hay muchas formas de resolver este problema, aquí se considera como un problema de plantilla de búsqueda de amplitud primero
Ideas de preguntas:
Comenzando desde el punto de partida, busque en las direcciones arriba, abajo, izquierda y derecha respectivamente. Si la búsqueda llega al final, significa que se puede llegar al final; de lo contrario, empuje el punto en la cola, continúe la búsqueda a continuación y agregue el punto Marcar como visitado.
Código
#include<bits/stdc++.h>
using namespace std;
char mp[600][600];
int vis[600][600];
int dx[4]={
0,1,-1,0};
int dy[4]={
1,0,0,-1};
queue<int> x,y; //利用STL中的队列
void bfs(int m,int n)
{
int flag=0,i;
while(!x.empty())
{
for(i=0;i<4;i++)
{
int tx=x.front()+dx[i]; //向上下左右四个方向进行搜索
int ty=y.front()+dy[i];
if(mp[tx][ty]=='E')
{
flag=1;
cout<<"Yes"<<endl;
break;
}
if(mp[tx][ty]=='.' && tx>=0 && tx<=m-1 && ty>=0 && ty<=n-1 && !vis[tx][ty]) //如果该点是空地并且没有超过边界限制
{
x.push(tx); //将该点压入队列中
y.push(ty);
vis[tx][ty]=1; //将该点标记为已访问
}
}
if(flag==1)
{
break;
}
x.pop(); //队首的元素出队
y.pop();
}
if(flag==0)
{
cout<<"No"<<endl;
}
}
int main()
{
int m,n,i,j;
while(cin>>m>>n)
{
memset(vis,0,sizeof(vis));
memset(mp,'l',sizeof(mp)); //这里一定要将mp二维数组进行重置
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='S')
{
x.push(i); //将迷宫起点的坐标位置压入队列中
y.push(j);
vis[i][j]=1; //标记起点已访问
}
}
}
bfs(m,n);
}
return 0;
}