#include<stdio.h>
#include<stdlib.h>
int R, C, S, T; //S记录开始位置, T记录目标位置
char *MAP; //地图
char *F1; //非0格子表示可以从起点到达的格子
char *F2; //非0格子表示可以到达目的的格子
//从格子G是否可以上移
bool CanUp(int G){
if(G-C>=0 && MAP[G-C]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='|'))
return true;
else
return false;
}
//从格子G是否可以下移
bool CanDown(int G){
if(G+C<R*C && MAP[G+C]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='|'||MAP[G]=='.'))
return true;
else
return false;
}
//从格子G是否可以左移
bool CanLeft(int G){
if(G%C>0 && MAP[G-1]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='-'))
return true;
else
return false;
}
//从格子G是否可以右移
bool CanRight(int G){
if(G%C<C-1 && MAP[G+1]!='#' && (MAP[G]=='+'||MAP[G]=='S'||MAP[G]=='T'||MAP[G]=='-'))
return true;
else
return false;
}
//递归遍历可以从G到达的邻居并更改F1
void ToNeighbor(int G){
int n;//邻居位置
//向上走
n = G - C;
if(!F1[n] && CanUp(G)){
F1[n] = 1;
ToNeighbor(n);
}
//向下走
n = G + C;
if(!F1[n] && CanDown(G)){
F1[n] = 1;
ToNeighbor(n);
}
//向左走
n = G - 1;
if(!F1[n] && CanLeft(G)){
F1[n] = 1;
ToNeighbor(n);
}
//向右走
n = G + 1;
if(!F1[n] && CanRight(G)){
F1[n] = 1;
ToNeighbor(n);
}
}
//递归遍历可以到达G的邻居并更改F2
void FromNeighbor(int G){
int n;//邻居位置
//判断上邻居
n = G - C;
if(n >= 0 && MAP[n] != '#' && !F2[n] && CanDown(n)){
F2[n] = 1;
FromNeighbor(n);
}
//判断下邻居
n = G + C;
if(n < R*C && MAP[n] != '#' && !F2[n] && CanUp(n)){
F2[n] = 1;
FromNeighbor(n);
}
//判断左邻居
n = G - 1;
if(G%C > 0 && MAP[n] != '#' && !F2[n] && CanRight(n)){
F2[n] = 1;
FromNeighbor(n);
}
//判断右邻居
n = G + 1;
if(G%C < C-1 && MAP[n] != '#' && !F2[n] && CanLeft(n)){
F2[n] = 1;
FromNeighbor(n);
}
}
int main(){
//初始化
scanf("%d%d",&R,&C); fflush(stdin);
MAP = (char*)malloc(sizeof(char) * R * C);
F1 = (char*)malloc(sizeof(char) * R * C);
F2 = (char*)malloc(sizeof(char) * R * C);
for(int i = 0; i < R * C; i++){
scanf(" %c",MAP + i);
if(MAP[i] == 'S')
S = i;
if(MAP[i] == 'T')
T = i;
F1[i] = 0;
F2[i] = 0;
}
//填充F1(非0格子表示可以从起点到达的格子 )
F1[S] = 1;
ToNeighbor(S);//递归遍历可以从S到达的格子并更改F1
//填充F2(非0格子表示可以到达目的的格子)
F2[T] = 1;
FromNeighbor(T);//递归遍历可以到达的T的格子并更改F1
if(!F1[T]){//从S不能到达T
printf("I'm stuck!");
return 0;
}
//计数有特征的格子个数
int q = 0;
for(int i = 0; i < R*C; i++)
if(F1[i] == 1 && F2[i] == 0)
q++;
printf("%d",q);
return 0;
}