如下代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define MAXN 110
#define N 21
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int dl[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dr[4][2]={{0,1},{-1,0,},{0,-1},{1,0}};
int sx,sy,ex,ey,n,m;
char G[MAXN][MAXN];
using namespace std;
struct Node
{
int x,y,s;
};
int DFS(int x,int y,int d,int step,int dir[][2])
{
for(int i=0;i<=3;i++)
{
int j=((d-1+4)%4+i)%4;
int nx=x+dir[j][0];
int ny=y+dir[j][1];
if(nx==ex&&ny==ey)
return step+1;
if(nx<0||ny<0||nx>=n||ny>=m)
continue;
if(G[nx][ny]=='#')
continue;
return DFS(nx,ny,j,step+1,dir);
}
}
int BFS(int sx,int sy)
{
bool v[MAXN][MAXN];
memset(v,false,sizeof(v));
queue<Node>Q;
Node p;
p.x=sx;
p.y=sy;
p.s=1;
Q.push(p);
v[sx][sy]=true;
while(!Q.empty())
{
Node p=Q.front();
Q.pop();
if(p.x==ex&&p.y==ey)
return p.s;
Node np;
for(int d=0;d<=3;d++)
{
np.x=p.x+dx[d];
np.y=p.y+dy[d];
np.s=p.s+1;
if(np.x<0||np.y<0||np.x>=n||np.y>=m)
continue;
if(v[np.x][np.y])
continue;
if(G[np.x][np.y]!='#')
{
v[np.x][np.y]=true;
Q.push(np);
}
}
}
return -1;
}
int main()
{
int T,d1,d2;
scanf("%d",&T);
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%s",G[i]);
for(int j=0;j<m;j++)
{
if(G[i][j]=='S')
{
sx=i;
sy=j;
}
else if(G[i][j]=='E')
{
ex=i;
ey=j;
}
}
}
if(sx==0)
{
d1=3,d2=3;
}
else if(sx==n-1)
{
d1=1;
d2=1;
}
else if(sy==0)
{
d1=2;
d2=0;
}
else if(sy==m-1)
{
d1=0;
d2=2;
}
cout<<DFS(sx,sy,d1,1,dl)<<' '<<DFS(sx,sy,d2,1,dr)<<' '<<BFS(sx,sy)<<endl;
}
//while(1);
return 0;
}