蓝桥杯迷宫1

迷宫

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。

输出

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出

9
#include<iostream>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;


const int maxn=1e3+10;
int n,m;
int dxy[4][2]={1,0,0,1,-1,0,0,-1};
char mp[maxn][maxn];
int vis[maxn][maxn];

struct node{
	int x;
	int y;
	int level;
	node(int xx,int yy,int llee)
	{
		x=xx;
		y=yy;
		level=llee;
	}
};
 
queue<node>q;
int check(int x,int y){
	
	if(x<0 || x>=n || y<0 || y>=m ||vis[x][y] ||mp[x][y]=='#')
	return 0;
	return 1;

}

int bfs(int x,int y)
{
	vis[x][y]=1;
 
	q.push(node(x,y,0));  //先进队列,  

	while(!q.empty()){  //队列不为空 
	
		
		int X,Y,Z;
	    node a=q.front();
		X=a.x;					//出一个 
		Y=a.y;
		Z=a.level;
		if(mp[a.x][a.y]=='E')   //终止条件 
		return Z;
		q.pop();
		for(int i=0;i<4;i++){  //循环4个方向
		
		int dx=a.x+dxy[i][0];
		int dy=a.y+dxy[i][1]; 
		
		if(check(dx,dy)){
			vis[dx][dy]=1;
			
			q.push(node(dx,dy,a.level+1));  //满足条件加入节点 
		}
		 
		
		
		
	}
}
}

int main()
{
	int k;
	cin>>k;
	while(k--){
 
	cin>>n>>m;
	int nn,mm;
	memset(mp,0,sizeof(mp));
	memset(vis,0,sizeof(vis));
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			
			cin>>mp[i][j];
			if(mp[i][j]=='S')
			{
				nn=i;
				mm=j;
				
			}
		}
	}
	
	cout<<bfs(nn,mm);
	
	
	
	
	}
	
}


原文地址:https://www.cnblogs.com/shenxiaodou/p/12557872.html