DFS
#include <iostream>
const int N = 55;
using namespace std;
int n,m;
bool st1[N][N],st2[N][N]; // st1判断从起点位置能否走到(i,j) st2判断能否从终点走到当前位置(i,j)
char g[N][N];
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1}; // 方向数组
bool check(int x,int y,int k) // 判断能否从(x,y)沿着第k(0到3)个方向走
{
char c = g[x][y];
if (c == '+' || c == 'S' || c == 'T') return true;
if (c == '-' && (k % 2)) return true;
if (c == '|' && !(k % 2)) return true;
if (c == '.' && k == 2 ) return true;
return false;
}
void dfs1(int x,int y)
{
st1[x][y] = true; // 标记为能到达
for (int i = 0; i < 4; ++i) {
int a = x + dx[i],b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == '#') continue; // 出界或者障碍物
if (st1[a][b]) continue; // 已经走过了
if (check(x,y,i)) dfs1(a,b); // 如果能从(x,y)走到(a,b)
}
}
void dfs2(int x,int y)
{
st2[x][y] = true;
for (int i = 0; i < 4; ++i) {
int a = x + dx[i] , b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == '#') continue;
if (st2[a][b]) continue;
if (check(a,b,i ^ 2)) dfs2(a,b); // 如果能从(a,b)走到(x,y) i ^ 2可以反向(0<->2 , 1<->3)
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> g[i];
}
int tx,ty; // 保存终点位置
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (g[i][j] == 'S') dfs1(i,j); //从起点开始遍历
else if (g[i][j] == 'T') {
tx = i;
ty = j;
dfs2(tx,ty); // 从终点反向遍历
}
}
}
if (!st1[tx][ty]) // 如果不能从起点走到终点
puts("I'm stuck!");
else
{
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (st1[i][j] && !st2[i][j]) ans++; // 满足题目的两个条件
}
}
cout << ans << endl;
}
return 0;
}