#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <queue> #include <algorithm> #include <iostream> using namespace std; char map[45][45]; char map2[45][45]; int n,m; int dir1_left[][2]={1,0,0,-1,-1,0}; int dir2_left[][2]={0,-1,-1,0,0,1}; int dir3_left[][2]={-1,0,0,1,1,0}; int dir4_left[][2]={0,1,1,0,0,-1}; int dir1_r[][2]={-1,0,0,-1,1,0}; int dir2_r[][2]={0,1,-1,0,0,-1}; int dir3_r[][2]={1,0,0,1,-1,0}; int dir4_r[][2]={0,-1,1,0,0,1}; int dir[][2]={0,1,0,-1,1,0,-1,0}; int pace_l; int pace_r; int flag; int pace; int legal(int x,int y) { if (x>=1&&y>=1&&x<=n&&y<=m) return 1; return 0; } struct node { int x,y; int time; }; queue <node> qq; int bfs(int x,int y) { node tmp; while(!qq.empty()) { tmp=qq.front(); qq.pop(); int i; for (i=0;i<4;i++) { int r=tmp.x+dir[i][0]; int c=tmp.y+dir[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { node tt=tmp; tt.x=r; tt.y=c; tt.time++; if (map[r][c]=='E') { pace=tt.time; return 0; } map[r][c]='#'; qq.push(tt); } } } } int dfs_l(int x,int y,int posi) { int i; if (map[x][y]=='E') { pace_l=pace; flag=1; return 0; } if (posi==1) { for (i=0;i<3;i++) { int r=x+dir1_left[i][0]; int c=y+dir1_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=4; if (i==1) pposi=1; if (i==2) pposi=2; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==2) { for (i=0;i<3;i++) { int r=x+dir2_left[i][0]; int c=y+dir2_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=1; if (i==1) pposi=2; if (i==2) pposi=3; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==3) { for (i=0;i<3;i++) { int r=x+dir3_left[i][0]; int c=y+dir3_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=2; if (i==1) pposi=3; if (i==2) pposi=4; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==4) { for (i=0;i<3;i++) { int r=x+dir4_left[i][0]; int c=y+dir4_left[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=3; if (i==1) pposi=4; if (i==2) pposi=1; pace++; dfs_l(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } return 0; } int dfs_r(int x,int y,int posi) { int i; if (map[x][y]=='E') { pace_r=pace; flag=1; return 0; } if (posi==1) { for (i=0;i<3;i++) { int r=x+dir1_r[i][0]; int c=y+dir1_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=2; if (i==1) pposi=1; if (i==2) pposi=4; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==2) { for (i=0;i<3;i++) { int r=x+dir2_r[i][0]; int c=y+dir2_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=3; if (i==1) pposi=2; if (i==2) pposi=1; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==3) { for (i=0;i<3;i++) { int r=x+dir3_r[i][0]; int c=y+dir3_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=4; if (i==1) pposi=3; if (i==2) pposi=2; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } if (posi==4) { for (i=0;i<3;i++) { int r=x+dir4_r[i][0]; int c=y+dir4_r[i][1]; if (legal(r,c)&&(map[r][c]=='.'||map[r][c]=='E')) { // if (map[r][c]=='.') map[r][c]='#'; int pposi; if (i==0) pposi=1; if (i==1) pposi=4; if (i==2) pposi=3; pace++; dfs_r(r,c,pposi); pace++; if (flag==1) return 0; map[r][c]='.'; } } } return 0; } int main() { int i,j; int t; cin>>t; while(t--) { memset(map,0,sizeof(map)); int sx,sy; cin>>m>>n; getchar(); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { scanf("%c",&map[i][j]); map2[i][j]=map[i][j]; if (map[i][j]=='S') { sx=i; sy=j; } } getchar(); } int posi; if (legal(sx+1,sy)&&map[sx+1][sy]=='.') posi=4; if (legal(sx,sy+1)&&map[sx][sy+1]=='.') posi=3; if (legal(sx-1,sy)&&map[sx-1][sy]=='.') posi=2; if (legal(sx,sy-1)&&map[sx][sy-1]=='.') posi=1; flag=0; pace=1; dfs_l(sx,sy,posi); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { map[i][j]=map2[i][j]; } } flag=0; pace=1; dfs_r(sx,sy,posi); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { map[i][j]=map2[i][j]; } } pace=1; while(!qq.empty()) qq.pop(); node tmp; tmp.x=sx; tmp.y=sy; tmp.time=1; qq.push(tmp); bfs(sx,sy); printf("%d %d %d\n",pace_l,pace_r,pace); } return 0; }