POJ 3083

来源:互联网 发布:sql 循环select结果集 编辑:程序博客网 时间:2024/05/29 11:34
#include <stdio.h>#include <memory.h>const int maxn=40+10;int visit[maxn*maxn];int map[maxn][maxn];int m,n;int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};int step1;int step2;void dfs1(int step ,int way,int tem){int x=tem/n;int y=tem%n;if(map[x][y]=='E'){step1=step;return ;}int k=(way+3)%4;int ndir;int dx,dy;for(int j=0;j<4;j++){ndir=(k+j)%4;dx=x+dir[ndir][0];dy=y+dir[ndir][1];if(dx>=0&&dx<m&&dy>=0&&dy<n&&map[dx][dy]!='#'){dfs1(step+1,ndir,dx*n+dy);return ;}    }}void dfs2(int step ,int way,int tem){int x=tem/n;int y=tem%n;if(map[x][y]=='E') {step2=step;return ;}int k=(way+1)%4;int ndir;int dx,dy;for(int j=0;j<4;j++){ndir=(k-j+4)%4;dx=x+dir[ndir][0];dy=y+dir[ndir][1];if(dx>=0&&dx<m&&dy>=0&&dy<n&&map[dx][dy]!='#'){ dfs2(step+1,ndir,dx*n+dy);return ;}}}int bfs(int st,int fin){int dis[maxn*maxn];dis[st]=1;int queue[maxn*maxn];int font=0;int rear=0;visit[st]=1;queue[rear++]=st;while(font<rear){int xy=queue[font++];int x=xy/n;int y=xy%n;int dx,dy;int dxy;for(int i=0;i<4;i++){dx=x+dir[i][0];dy=y+dir[i][1];dxy=dx*n+dy;if(map[dx][dy]!='#'&&dx>=0&&dx<m&&dy>=0&&dy<n&&!visit[dxy]){visit[dxy]=1;queue[rear++]=dxy;dis[dxy]=dis[xy]+1;if(dxy==fin) return dis[fin];}}}}int main(){int N;scanf("%d",&N);while(N--){step1=1;step2=1;memset(visit,0,sizeof(visit));int st;int fin;scanf("%d %d",&n,&m);int i,j;int way;for(i=0;i<m;i++){getchar();for(j=0;j<n;j++){scanf("%c",&map[i][j]);if(map[i][j]=='S'){ st=i*n+j;if(i==0) way=3;if(i==m-1) way=1;if(j==0) way=2;if(j==n-1) way=0;}if(map[i][j]=='E') fin=i*n+j;}}dfs1(1,way,st);dfs2(1,way,st);printf("%d %d %d\n",step1,step2,bfs(st,fin));}return 0;}