#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn=30; struct node{ int x,y,c,dr,s; }; char str[maxn]; bool p[maxn][maxn][5][4],a[maxn][maxn]; struct node q[maxn*maxn*4*5]; void din(int i,int x1,int y1,int c1,int dr1,int s1){ q[i].x=x1;q[i].y=y1;q[i].s=s1;q[i].c=c1;q[i].dr=dr1; } int main(){ #ifndef ONLINE_JUDGE freopen("uva10047.in","r",stdin); freopen("uva10047.out","w",stdout); #endif int i,j,k,k1,m,n; int xs,ys,xt,yt,e,T=0; int f,l,u,v,w; while(1){ T++; memset(p,0,sizeof(p)); memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); if(n*m==0)break; if(T>1)puts(""); getchar(); for(i=1;i<=n;i++){ gets(str); for(j=0;j<m;j++){ if(str[j]!='#') a[i][j+1]=1; if(str[j]=='S'){ xs=i;ys=j+1; } if(str[j]=='T'){ xt=i;yt=j+1; } } } f=0;l=1; din(1,xs,ys,0,0,0); p[xs][ys][0][0]=1; int flag=0,ans; int col,dre; while(f<l){ f++; u=q[f].x;v=q[f].y;w=q[f].s;col=q[f].c;dre=q[f].dr; if(!p[u][v][col][(dre+1)%4]){ din(++l,u,v,col,(dre+1)%4,w+1); p[u][v][col][(dre+1)%4]=1; } if(!p[u][v][col][(dre+3)%4]){ din(++l,u,v,col,(dre+3)%4,w+1); p[u][v][col][(dre+3)%4]=1; } if(dre==0 && a[u-1][v] && !p[u-1][v][(col+1)%5][dre]){ din(++l,u-1,v,(col+1)%5,dre,w+1); p[u-1][v][(col+1)%5][dre]=1; if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;} } if(dre==1 && a[u][v+1] && !p[u][v+1][(col+1)%5][dre]){ din(++l,u,v+1,(col+1)%5,dre,w+1); p[u][v+1][(col+1)%5][dre]=1; if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;} } if(dre==2 && a[u+1][v] && !p[u+1][v][(col+1)%5][dre]){ din(++l,u+1,v,(col+1)%5,dre,w+1); p[u+1][v][(col+1)%5][dre]=1; if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;} } if(dre==3 && a[u][v-1] && !p[u][v-1][(col+1)%5][dre]){ din(++l,u,v-1,(col+1)%5,dre,w+1); p[u][v-1][(col+1)%5][dre]=1; if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;} } } if(!flag) printf("Case #%d\ndestination not reachable\n",T); else printf("Case #%d\nminimum time = %d sec\n",T,ans); } return 0; }