好吧,让我一点一点变强大,每一天都被很小的一个错误折磨……
注意那个图的输入!!!!长和宽要注意!!!!!
dfs的出口要注意!!!!
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
int sx,sy,ex,ey;
char room[41][41];
struct node
{
int x,y;
int step;
} queue[800];
int vis[41][41];
int move[2][8][2]= {{{0,-1},{-1,0},{0,1},{1,0},{0,-1},{-1,0},{0,1},{1,0}},{{0,1},{-1,0},{0,-1},{1,0},{0,1},{-1,0},{0,-1},{1,0}}};
int dx[4]= {-1,1,0,0};
int dy[4]= {0,0,-1,1};
int dfs(int k)
{
int d=0;
int i;
int step=1;
int x=sx,y=sy;
while(room[x][y]!='#'&&room[x][y]!='E')
{
for(d=(d+3)%4,i=d; i<d+4; i++)
{
int tx=x+move[k][i][0];
int ty=y+move[k][i][1];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&room[tx][ty]!='#')
{
x=tx;
y=ty;
d=i%4;
step++;
break;
}
}
}
return step;
}
int bfs()
{
int front=0,back=0;
queue[back].x=sx;
queue[back].y=sy;
queue[back++].step=1;
vis[sx][sy]=1;
while(front<=back)
{
int xx=queue[front].x;
int yy=queue[front].y;
for(int i=0; i<4; i++)
{
int tx=xx+dx[i];
int ty=yy+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<m&&room[tx][ty]!='#'&&!vis[tx][ty])
{
vis[tx][ty]=1;
queue[back].x=tx;
queue[back].y=ty;
queue[back].step=queue[front].step+1;
if(tx==ex&&ty==ey) return queue[back].step;
back++;
}
}
front++;
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%d%d",&m,&n);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cin>>room[i][j];
if(room[i][j]=='S')
{
sx=i,sy=j;
}
if(room[i][j]=='E')
{
ex=i;
ey=j;
}
}
printf("%d ",dfs(0));
printf("%d ",dfs(1));
printf("%d\n",bfs());
}
}