Trap question....
Just put all the people who can reach the exit before the protagonist at the exit and wait for him.
No need to think about intercepting halfway, because intercepting halfway can also go to the exit with the protagonist and then fight.
//====================================================================||
// Name : Biridian Forest.cpp ||
// Date : 2013/7/21 下午2:56:36 ||
// Author : GCA ||
// 6AE7EE02212D47DAD26C32C0FE829006 ||
//====================================================================||
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <cctype>
#include <utility>
using namespace std;
#ifdef ONLINE\_JUDGE
#define ll "%lld"
#else
#define ll "%I64d"
#endif
typedef unsigned int uint;
typedef long long int Int;
typedef pair<int,int\> PII;
#define Set(a,s) memset(a,s,sizeof(a))
#define Write(w) freopen(w,"w",stdout)
#define Read(r) freopen(r,"r",stdin)
#define Pln() printf("\\n")
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()
#define De(x)printf(#x"%d\\n",x)
#define For(i,x)for(int i=0;i<x;i++)
#define CON(x,y) x##y
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\
printf("%d ",dp\[htx\]\[hty\]);}Pln();}
#define M 1001
#define PB push\_back
#define oo (1<<29)
#define Set\_oo 0x3f
#define Is\_debug true
#define debug(...) if(Is\_debug)printf("DEBUG: "),printf(\_\_VA\_ARGS\_\_)
#define FOR(it,c) for(\_\_typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define eps 1e-6
bool xdy(double x,double y){return x>y+eps;}
bool xddy(double x,double y){return x>y-eps;}
bool xcy(double x,double y){return x<y-eps;}
bool xcdy(double x,double y){return x<y+eps;}
int min3(int x,int y,int z){
int tmp=min(x,y);
return min(tmp,z);
}
int max3(int x,int y,int z){
int tmp=max(x,y);
return max(tmp,z);
}
int ny,nx;
int mz\[M\]\[M\];
bool v\[M\]\[M\];
int d\[M\]\[M\];
int ex,ey,bx,by;
int dx\[4\]={0,0,1,-1};
int dy\[4\]={1,-1,0,0};
void solve(){
fill(&d\[0\]\[0\],&d\[M-1\]\[M-1\],oo);
d\[ex\]\[ey\]=0;
queue<PII> q;
q.push(PII(ex,ey));
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int i=0;i<4;i++){
int nex=x+dx\[i\],ney=y+dy\[i\];
if(v\[nex\]\[ney\])continue;
if(nex<0||nex>=nx||ney<0||ney>=ny)continue;
if(d\[x\]\[y\]+1<d\[nex\]\[ney\]){
d\[nex\]\[ney\]=d\[x\]\[y\]+1;
q.push(PII(nex,ney));
}
}
}
int ans=0;
// debug("%d %d\\n",d\[ex\]\[ey\],d\[2\]\[0\]);
for(int i=0;i<ny;i++){
for(int j=0;j<nx;j++){
if(d\[j\]\[i\]<=d\[bx\]\[by\]){
ans+=mz\[j\]\[i\];
}
}
}
printf("%d\\n",ans);
}
int main() {
ios\_base::sync\_with\_stdio(0);
while(~scanf("%d%d%\*c",&ny,&nx)){
char c;
Set(v,0);
Set(mz,0);
for(int i=0;i<ny;i++){
for(int j=0;j<nx;j++){
scanf("%c",&c);
if(c=='E'){
ex=j;ey=i;
}else if(c=='S'){
bx=j;by=i;
}else if(c=='T'){
v\[j\]\[i\]=1;
}else{
mz\[j\]\[i\]=c-'0';
}
}getchar();
}
solve();
}
}