//搜索
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=100;
4 char mat[maxn][maxn];
5 struct node
6 {
7 int point;
8 };
9 node q[maxn*maxn];
10 int start,fin;
11 int top,base;
12 int ans,tx,ty;
13 int n,m;
14 bool flag=0;
15 bool vis1[maxn][maxn],vis2[maxn][maxn];
16 int next[4][2]={-1,0,1,0,0,-1,0,1};
17 bool can(int ll,int rr)
18 {
19 return ll>=0&&ll<=n-1&&rr>=0&&rr<=m-1;
20 }
21 void bfs1()
22 {
23 while(base<top){
24 int l=q[base].point/m,r=q[base].point%m,ll,rr;
25 if(mat[l][r]==‘+‘||mat[l][r]==‘S‘||mat[l][r]==‘T‘){
26 for(int i=0;i<4;i++)
27 {
28 ll=l+next[i][0];rr=r+next[i][1];
29 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=‘#‘){
30 vis1[ll][rr]=1;
31 q[top].point=ll*m+rr;
32 top++;
33 }
34 }
35 }
36 if(mat[l][r]==‘-‘){
37 for(int i=2;i<4;i++)
38 {
39 ll=l+next[i][0];rr=r+next[i][1];
40 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=‘#‘){
41 vis1[ll][rr]=1;
42 q[top].point=ll*m+rr;
43 top++;
44 }
45 }
46 }
47 if(mat[l][r]==‘|‘){
48 for(int i=0;i<2;i++)
49 {
50 ll=l+next[i][0];rr=r+next[i][1];
51 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=‘#‘){
52 vis1[ll][rr]=1;
53 q[top].point=ll*m+rr;
54 top++;
55 }
56 }
57 }
58 if(mat[l][r]==‘.‘){
59 for(int i=1;i<2;i++)
60 {
61 ll=l+next[i][0];rr=r+next[i][1];
62 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=‘#‘){
63 vis1[ll][rr]=1;
64 q[top].point=ll*m+rr;
65 top++;
66 }
67 }
68 }
69 base++;
70 }
71 if(vis1[tx][ty]) flag=1;
72 }
73
74 void bfs2()
75 {
76 while(base<top){
77 int l=q[base].point/m,r=q[base].point%m,ll,rr;
78 for(int i=0;i<4;i++)
79 {
80 ll=l+next[i][0];rr=r+next[i][1];
81 if(i==0){
82 if(can(ll,rr)&&!vis2[ll][rr]&&(mat[ll][rr]==‘+‘||mat[ll][rr]==‘S‘||mat[ll][rr]==‘T‘||mat[ll][rr]==‘|‘||mat[ll][rr]==‘.‘)){
83 vis2[ll][rr]=1;
84 q[top].point=ll*m+rr;
85 top++;}
86 }
87 else if(i==1){
88 if(can(ll,rr)&&!vis2[ll][rr]&&(mat[ll][rr]==‘+‘||mat[ll][rr]==‘S‘||mat[ll][rr]==‘T‘||mat[ll][rr]==‘|‘)){
89 vis2[ll][rr]=1;
90 q[top].point=ll*m+rr;
91 top++;}
92 }
93 else if(i==2||i==3){
94 if(can(ll,rr)&&!vis2[ll][rr]&&(mat[ll][rr]==‘+‘||mat[ll][rr]==‘S‘||mat[ll][rr]==‘T‘||mat[ll][rr]==‘-‘)){
95 vis2[ll][rr]=1;
96 q[top].point=ll*m+rr;
97 top++;}
98 }
99 }
100 base++;
101 }
102 }
103 int main()
104 {
105 //freopen("in.txt","r",stdin);
106 while(~scanf("%d%d",&n,&m)){
107 flag=0;
108 memset(vis1,0,sizeof(vis1));
109 memset(vis2,0,sizeof(vis2));
110 for(int i=0;i<n;i++)
111 {
112 scanf("%s",mat[i]);
113 }
114 //if(n>=48){printf("0\n");continue;}
115 for(int i=0;i<n;i++)
116 for(int j=0;j<m;j++)
117 {
118 if(mat[i][j]==‘S‘){
119 start=i*m+j;
120 }
121 else if(mat[i][j]==‘T‘){
122 fin=i*m+j;
123 tx=i;ty=j;
124 }
125 }
126 top=base=0;
127 q[top].point=start;
128 top++;
129 vis1[start/m][start%m]=1;
130 bfs1();
131 if(!flag) {puts("I‘m stuck!");continue;}
132 top=base=0;
133 q[top].point=fin;
134 top++;
135 vis2[fin/m][fin%m]=1;
136 bfs2();
137 int ans=0;
138 for(int i=0;i<n;i++)
139 for(int j=0;j<m;j++)
140 {
141 if(vis1[i][j]&&!vis2[i][j]){
142 ans++;
143 }
144 }
145 cout<<ans<<endl;
146 }
147 return 0;
148 }