Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10933 | Accepted: 4708 |
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9 注意好靠左走和靠右走的方向就行#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <map> #include <set> #include <queue> #include <stack> #include <algorithm> #include <cstdlib> #define INF 0x3f3f3f3f using namespace std; char Map[100][110]; int Left,Right,Short; bool vis[110][110]; int Dir[][2]={{0,1},{1,0},{0,-1},{-1,0}}; int n,m; struct node { int x; int y; int step; }; void Left_Look(int step,int dir,int X,int Y) { if(Map[X][Y]=='E') { Left=step; return ; } dir--; if(dir<0) { dir=3; } int d,fx,fy; for(int i=0;i<4;i++) { d=dir+i; if(d>=4) { d-=4; } fx=Dir[d][0]+X; fy=Dir[d][1]+Y; if(fx>=0&&fx<n&&fy>=0&&fy<m&&Map[fx][fy]!='#') { Left_Look(step+1,d,fx,fy); break; } } } void Right_Look(int step,int dir,int X,int Y) { if(Map[X][Y]=='E') { Right=step; return ; } dir++; dir%=4; int d,fx,fy; for(int i=0;i<4;i++) { d=dir-i; if(d<0) { d+=4; } fx=Dir[d][0]+X; fy=Dir[d][1]+Y; if(fx>=0&&fx<n&&fy>=0&&fy<m&&Map[fx][fy]!='#') { Right_Look(step+1,d,fx,fy); break; } } } void BFS(int X,int Y) { node a,b; a.x=X; a.y=Y; a.step=1; memset(vis,false,sizeof(vis)); vis[X][Y]=true; queue<node >Q; Q.push(a); while(!Q.empty()) { a=Q.front(); Q.pop(); if(Map[a.x][a.y]=='E') { Short=a.step; return ; } for(int i=0;i<4;i++) { b.x=a.x+Dir[i][0]; b.y=a.y+Dir[i][1]; b.step=a.step+1; if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&!vis[b.x][b.y]&&Map[b.x][b.y]!='#') { vis[b.x][b.y]=true; Q.push(b); } } } } int main() { int T; int x; int y; scanf("%d",&T); while(T--) { scanf("%d %d",&m,&n); for(int i=0; i<n; i++) { scanf("%s",Map[i]); for(int j=0;j<m;j++) { if(Map[i][j]=='S') { x=i; y=j; } } } if(x==0) { Left_Look(1,2,x,y); Right_Look(1,2,x,y); } else if(x==n-1) { Left_Look(1,0,x,y); Right_Look(1,0,x,y); } else if(y==0) { Left_Look(1,1,x,y); Right_Look(1,1,x,y); } else if(y==m-1) { Left_Look(1,3,x,y); Right_Look(1,3,x,y); } BFS(x,y); cout<<Left<<" "<<Right<<" "<<Short<<endl; } return 0; }