1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 5 using namespace std; 6 typedef pair<int,int>P; 7 const int dx[4]={1,0,-1,0}; 8 const int dy[4]={0,1,0,-1}; 9 const int INF=1e9; 10 int sx,sy,ex,ey,n,m; 11 char a[50][50]; 12 int d[50][50]; 13 14 bool pd(int x,int y) 15 { 16 if (x>=0 && x<n && y>=0 && y<m && a[x][y]!=‘#‘) return true; 17 return false; 18 } 19 20 int dfs(int x,int y,int xx,int yy,char d) 21 { 22 if (x==xx && y==yy) return 1; 23 if (d==‘U‘) 24 { 25 if (pd(x-1,y)) return dfs(x-1,y,xx,yy,‘L‘)+1; 26 else if (pd(x,y-1)) return dfs(x,y-1,xx,yy,‘U‘)+1; 27 else if (pd(x+1,y)) return dfs(x+1,y,xx,yy,‘R‘)+1; 28 else if (pd(x,y+1)) return dfs(x,y+1,xx,yy,‘D‘)+1; 29 } 30 else if (d==‘L‘) 31 { 32 if (pd(x,y+1)) return dfs(x,y+1,xx,yy,‘D‘)+1; 33 else if (pd(x-1,y)) return dfs(x-1,y,xx,yy,‘L‘)+1; 34 else if (pd(x,y-1)) return dfs(x,y-1,xx,yy,‘U‘)+1; 35 else if (pd(x+1,y)) return dfs(x+1,y,xx,yy,‘R‘)+1; 36 } 37 else if (d==‘D‘) 38 { 39 if (pd(x+1,y)) return dfs(x+1,y,xx,yy,‘R‘)+1; 40 else if (pd(x,y+1)) return dfs(x,y+1,xx,yy,‘D‘)+1; 41 else if (pd(x-1,y)) return dfs(x-1,y,xx,yy,‘L‘)+1; 42 else if (pd(x,y-1)) return dfs(x,y-1,xx,yy,‘U‘)+1; 43 } 44 else if (d==‘R‘) 45 { 46 if (pd(x,y-1)) return dfs(x,y-1,xx,yy,‘U‘)+1; 47 else if (pd(x+1,y)) return dfs(x+1,y,xx,yy,‘R‘)+1; 48 else if (pd(x,y+1)) return dfs(x,y+1,xx,yy,‘D‘)+1; 49 else if (pd(x-1,y)) return dfs(x-1,y,xx,yy,‘L‘)+1; 50 } 51 } 52 53 int bfs(int sx,int sy,int ex,int ey) 54 { 55 int v[50][50]; 56 for (int i=0;i<50;i++) 57 for (int j=0;j<50;j++) d[i][j]=INF; 58 59 queue<P> que; 60 que.push(P(sx,sy)); 61 d[sx][sy]=1; 62 while (que.size()) 63 { 64 P p=que.front(); 65 que.pop(); 66 if (p.first==ex && p.second==ey) break; 67 for (int i=0;i<4;i++) 68 { 69 int nx=p.first+dx[i]; 70 int ny=p.second+dy[i]; 71 if (pd(nx,ny) && d[nx][ny]==INF) 72 { 73 que.push(P(nx,ny)); 74 d[nx][ny]=d[p.first][p.second]+1; 75 } 76 } 77 } 78 return d[ex][ey]; 79 } 80 int main() 81 { 82 int tot; 83 scanf("%d",&tot); 84 for(int t=1;t<=tot;t++) 85 { 86 scanf("%d%d",&m,&n); 87 for (int i=0;i<n;i++) 88 { 89 scanf("%s",a[i]); 90 for(int j=0;j<m;j++) 91 { 92 if (a[i][j]==‘S‘) 93 { 94 sx=i; 95 sy=j; 96 }else 97 if (a[i][j]==‘E‘) 98 { 99 ex=i; 100 ey=j; 101 } 102 } 103 } 104 // printf("%d %d\n",ex,ey); 105 int ans2=dfs(sx,sy,ex,ey,‘U‘); 106 int ans1=dfs(ex,ey,sx,sy,‘U‘); 107 int ans3=bfs(sx,sy,ex,ey); 108 printf("%d %d %d\n",ans1,ans2,ans3); 109 } 110 return 0; 111 }
时间: 2024-12-20 19:01:29