Resumen de la pregunta fuera del laberinto

Resumen de la pregunta fuera del laberinto

Enlace al título original:

Fuera del laberinto

tema
Descripción del tema Fuera del laberinto

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

Supongo que te gusta

Origin blog.csdn.net/m0_46772594/article/details/108230583
Recomendado
Clasificación