DFS+BFS。BFS部分比较水就不用多说了,主要是DFS搜索靠着左边或者右边的墙走的步数,仅说左边,方向应该是先上再右再下再左,用一个变量D来记录当前的前进方向
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct pot{
int x,y;
};
char map[45][45];
int dp[45][45];
int move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int moveleft[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
int moveright[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int minstep,stepleft,stepright,n,m;
int sx,sy,fx,fy,yes,d1,d2;
int dfs1(int x,int y,int d){
if(map[x][y]=='E') return 1;
int s,nx,ny,step;
for(int i=0;i<4;i++){
s=(d+i)%4;
nx=x+moveleft[s][1];
ny=y+moveleft[s][0];
if(0<=nx&&nx<n&&0<=ny&&ny<m&&map[nx][ny]!='#'){
break;
}
}
step=dfs1(nx,ny,(s+3)%4)+1;
return step;
//return 0;
}
int dfs2(int x,int y,int d){
if(map[x][y]=='E') return 1;
int s,nx,ny,step;
for(int i=0;i<4;i++){
s=(d+i)%4;
nx=x+moveright[s][1];
ny=y+moveright[s][0];
if(0<=nx&&nx<n&&0<=ny&&ny<m&&map[nx][ny]!='#'){
break;
}
}
step=dfs2(nx,ny,(s+3)%4)+1;
return step;
//return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++) scanf("%s",map[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]=='S'){
sx=i;
sy=j;
}
if(map[i][j]=='E'){
fx=i;
fy=j;
}
}
}
d1=1;
d2=1;
memset(dp,-1,sizeof(dp));
queue<pot> q;
pot p,s;
p.x=sx;
p.y=sy;
q.push(p);
dp[sx][sy]=1;
while(!q.empty()){
p=q.front();
q.pop();
if(map[p.x][p.y]=='E'){
minstep=dp[p.x][p.y];
break;
}
for(int i=0;i<4;i++){
s.x=p.x+move[i][0];
s.y=p.y+move[i][1];
if(0<=s.x&&s.x<n&&0<=s.y&&s.y<m&&dp[s.x][s.y]==-1&&map[s.x][s.y]!='#'){
dp[s.x][s.y]=dp[p.x][p.y]+1;
q.push(s);
}
}
}
yes=0;
stepleft=dfs1(sx,sy,d1);
stepright=dfs2(sx,sy,d2);
printf("%d %d %d\n",stepleft,stepright,minstep);
}
return 0;
}