Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9614 | Accepted: 4170 |
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
Source
靠着左墙走的话,想象一下,在状态中记录行走的方向,在已知方向上向左看是否能走,如果能就走那条路,抛弃其他情况;如果左走不了就向前……;前走不了就向右……;右走不了就向后(后一定能走);
仔细推敲下,就能想出来,写的时候细心点就能AC
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<algorithm> using namespace std; char g[50][50]; bool done[50][50]; int n,m,sx,sy,ex,ey; int ldx[]={0,-1,0,1}; int ldy[]={-1,0,1,0}; int rdx[]={0,-1,0,1}; int rdy[]={1,0,-1,0}; struct node { int x,y,w,dir; node(int xx=0,int yy=0,int ww=0,int dd=0) { x=xx;y=yy;w=ww;dir=dd; } }; bool is_ill(int x,int y) { return x<0||y<0||x>=n||y>=m; } int bfs1(int *dx,int *dy) { queue<node>q; int i,last=1; for(i=0;i<5;i++) { int curx=sx+dx[i%4]; int cury=sy+dy[i%4]; if(is_ill(curx,cury)||g[curx][cury]=='#') { last=0; continue; } if(!last)break; } q.push(node(sx+dx[i%4],sy+dy[i%4],2,i)); while(!q.empty()) { node x=q.front();q.pop(); for(i=0;i<4;i++) { int curx=x.x+dx[(i+x.dir+3)%4]; int cury=x.y+dy[(i+x.dir+3)%4]; if(is_ill(curx,cury)||g[curx][cury]=='#')continue; if(g[curx][cury]=='E')return x.w+1; if(g[curx][cury]=='.') { q.push(node(curx,cury,x.w+1,(i+x.dir+3)%4)); break; } } } return -1; } int bfs(int *dx,int *dy) { queue<node>q; memset(done,0,sizeof done); q.push(node(sx,sy,1)); done[sx][sy]=1; while(!q.empty()) { node x=q.front();q.pop(); for(int i=0;i<4;i++) { int curx=x.x+dx[i]; int cury=x.y+dy[i]; if(is_ill(curx,cury)||g[curx][cury]=='#'||done[curx][cury])continue; if(g[curx][cury]=='E')return x.w+1; if(g[curx][cury]=='.') { q.push(node(curx,cury,x.w+1,(i+x.dir+3)%4)); done[curx][cury]=1; } } } return -1; } int main() { int N,i,j,k; scanf("%d",&N); while(N--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) scanf("%s",g[i]); for(i=0;i<n;i++) for(j=0;j<m;j++) if(g[i][j]=='S')sx=i,sy=j; printf("%d %d %d\n",bfs1(ldx,ldy),bfs1(rdx,rdy),bfs(ldx,ldy)); } return 0; }