模拟+BFS ,应该没什么难度吧,注意向左或向右转的时候优先搜索路径的顺序就可以了。编写两个函数turnleft和turnright, 通过对当前朝向的判断来控制路径就能轻松AC了。另外这道题的代码写长了,left和right函数应该可以写的更好一点,不过效率应该和现在差不多。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define MAXN 40
using namespace std;
char map[MAXN+10][MAXN+10];
bool vis[MAXN+10][MAXN+10];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct state{
int x,y;
int front;
};
state turnleft(state t)
{
t.front=(t.front-1+4)%4;
return t;
}
state turnright(state t)
{
t.front=(t.front+1)%4;
return t;
}
int left(state s,int step){
int ans;
if(map[s.x][s.y]=='E'){
ans=step;
return ans;
}
//printf("cur:[%d][%d],step=%d\n",s.x,s.y,step);
s=turnleft(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=left(s,step+1);
}else{
s=turnright(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=left(s,step+1);
}else{
s=turnright(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=left(s,step+1);
}else{
s=turnright(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=left(s,step+1);
}
}
}
}
return ans;
}
int right(state s,int step){
int ans;
if(map[s.x][s.y]=='E'){
ans=step;
return ans;
}
//printf("cur:[%d][%d],step=%d\n",s.x,s.y,step);
s=turnright(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=right(s,step+1);
}else{
s=turnleft(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=right(s,step+1);
}else{
s=turnleft(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=right(s,step+1);
}else{
s=turnleft(s);
int tx=dx[s.front]+s.x;
int ty=dy[s.front]+s.y;
if(map[tx][ty]!='#'){
s.x=tx;
s.y=ty;
ans=right(s,step+1);
}
}
}
}
return ans;
}
int bfs(int x,int y)
{
int ans;
queue<state>q;
state tt={x,y,1};
vis[x][y]=true;
q.push(tt);
while(!q.empty()){
int cx=q.front().x;
int cy=q.front().y;
int cs=q.front().front;
if(map[cx][cy]=='E'){
ans=cs;
break;
}
q.pop();
for(int i=0;i<4;i++){
int tx=cx+dx[i];
int ty=cy+dy[i];
if(map[tx][ty]!='#'&&!vis[tx][ty]){
vis[tx][ty]=true;
tt.x=tx;
tt.y=ty;
tt.front=cs+1;
q.push(tt);
}
}
}
return ans;
}
int main()
{
int n,w,h;
int bx,by;
cin >> n;
while(n--){
cin >> w >> h;
memset(map,'#',sizeof(map));
memset(vis,false,sizeof(vis));
getchar();
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='S'){
bx=i;
by=j;
}
}
getchar();
}
state l={bx,by,1};
printf("%d %d %d\n",left(l,1),right(l,1),bfs(bx,by));
}
return 0;
}