问题并不复杂,用bfs搜索,从起点到终点即为最短路程。
但是判断条件写错了,找了半天错误,ma[x][y]!='#',开始写的是ma[x][y]=='-',如果按照刚开始的写法,是不能搜索到'E'终点的;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int x,y,step;
};
int m,n;
int cnt;
int d[4][2]={1,0,-1,0,0,1,0,-1};
char ma[105][105];
bool vis[105][105];
bool check(int x,int y)
{
if(x<n&&x>=0&&y<m&&y>=0&&ma[x][y]!='#'&&!vis[x][y])
return 1;
else
return 0;
}
void bfs(node st)
{
node next;
queue<node> q;
st.step=0;
q.push(st);
vis[st.x][st.y]=1;
while(!q.empty())
{
st=q.front();
q.pop();
if(ma[st.x][st.y]=='E')
{
cnt=st.step;
return;
}
for(int i=0;i<4;i++)
{
next.x=st.x+d[i][0];
next.y=st.y+d[i][1];
if(check(next.x,next.y))
{
next.step=st.step+1;
vis[next.x][next.y]=1;
q.push(next);
}
}
}
cnt=-1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
node st;
memset(vis,0,sizeof(vis));
memset(ma,'\0',sizeof(ma));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",ma[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(ma[i][j]=='S')
{
st.x=i;
st.y=j;
bfs(st);
break;
}
}
printf("%d\n",cnt);
}
return 0;
}