#include #include #include #include #define v 21 #include using namespace std; char mapp[21][21]; int x1,x2,y1,y2; int dir[4][2]={{1,0},{0,-1},{-1,0},{0,1}}; int used2[21][21]; int m,n; int ans;int used[21][21]; int check(int y,int x) { if(y>m||y<1||x>n||x<1) { return 1; } if(mapp[y][x]=='*'||used[y][x]==1) return 1; return 0; } struct node{ int x,y,time; bool friend operator<(node n1,node n2) { return n1.time>n2.time; } }; int bfs() { priority_queueq; node pre; int i,X,Y; pre.x=x1;pre.y=y1; pre.time=0; q.push(pre); while(!q.empty()) { pre=q.top(); q.pop(); if(pre.x==x2&&pre.y==y2) { return pre.time; } node next; if(mapp[pre.y][pre.x]=='.'||mapp[pre.y][pre.x]=='S') { if(!used2[pre.y][pre.x]) { used2[pre.y][pre.x]=1; next.x=pre.x;next.y=pre.y;next.time=pre.time+1; q.push(next); } } for(i=0;i<4;i++) { X=pre.x+dir[i][0];Y=pre.y+dir[i][1]; if(check(Y,X)) continue; if(mapp[Y][X]=='.') { next.x=X;next.y=Y;next.time=pre.time+1; used[Y][X]=1; q.push(next); } else if(mapp[Y][X]=='|') { if(pre.time%2==0&&(dir[i][1]==1||dir[i][1]==-1)) { if(check(Y+dir[i][1],X)) continue; Y+=dir[i][1]; used[Y][X]=1; next.x=X;next.y=Y;next.time=pre.time+1; q.push(next); } if(pre.time%2==1&&(dir[i][0]==1||dir[i][0]==-1)) { if(check(Y,X+dir[i][0])) continue; X+=dir[i][0];used[Y][X]=1; next.x=X;next.y=Y;next.time=pre.time+1; q.push(next); } } else if(mapp[Y][X]=='-') { if(pre.time%2==0&&(dir[i][0]==1||dir[i][0]==-1)) { X+=dir[i][0]; if(check(Y,X)) continue; used[Y][X]=1; next.x=X;next.y=Y;next.time=pre.time+1; q.push(next); } else if(pre.time%2==1&&(dir[i][1]==1||dir[i][1]==-1)) { Y+=dir[i][1]; if(check(Y,X))continue;used[Y][X]=1; next.x=X;next.y=Y;next.time=pre.time+1; q.push(next); } } } } return -1; } int main() { while(scanf("%d%d",&m,&n)!=EOF) { int i,j; memset(used,0,sizeof(used)); memset(used2,0,sizeof(used2)); for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>mapp[i][j]; if(mapp[i][j]=='T') { y2=i;x2=j; mapp[i][j]='.'; } if(mapp[i][j]=='S') { mapp[i][j]='.'; y1=i;x1=j; } } ans=bfs(); printf("%d\n",ans); } return 0; }