![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> #include <queue> using namespace std; #define MAXN 1005 struct node { int x; int y; int step; }; char maps[MAXN][MAXN]; char vis[MAXN][MAXN]; int to[4][2]= {{-1,0},{1,0},{0,1},{0,-1}}; int r,c; int sx,sy; ///起点 int ans; int check(int x,int y) { if(x<0||x>=r||y<0||y>=c) return 1; if(vis[x][y]||maps[x][y]=='#') return 1; return 0; } void bfs() { queue<node>Q; node a,next; a.x=sx; a.y=sy; a.step=0; vis[a.x][a.y]=true; Q.push(a); while(!Q.empty()) { a=Q.front(); Q.pop(); if(maps[a.x][a.y]=='E') { ans=a.step; return; } for(int i=0; i<4; i++) { next=a; next.x+=to[i][0]; next.y+=to[i][1]; if(check(next.x,next.y)) continue; next.step=a.step+1; vis[next.x][next.y]=true; Q.push(next); } } ans=-1; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&r,&c); for(int i=0; i<r; i++) { scanf("%s",maps[i]); for(int j=0; j<c; j++) { if(maps[i][j]=='S') { sx=i; sy=j; } } } memset(vis,false,sizeof(vis)); bfs(); printf("%d ",ans); } return 0; }