依次对每个数字bfs,得到的结果与从S点bfs比较,这样进行了多次bfs会超时,可以从E点开始搜索,直到把S和与它同一层都搜索完之后就可以结束了,因为这样搜索过程中遇到的数字都是<=S的步数的
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cctype>
#include <cstring>
using namespace std;
struct Node
{
int x;
int y;
int step;
Node(int x1,int y1,int steps):x(x1),y(y1),step(steps){}
};
int starts[1][2],n,m,Visit[1005][1005],sum,STEP;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};
char s[1005][1005];
int BFS(int a,int b)
{
queue<Node>q;
q.push(Node(a,b,0));
Visit[a][b]=1;
while(!q.empty())
{
Node t=q.front();
if(t.step-1==STEP)
return sum;
q.pop();
for(int i=0;i<4;i++)
{
int c=t.x+dx[i];
int d=t.y+dy[i];
if(c<n&&c>=0&&d>=0&&d<m&&s[c][d]!='T'&&Visit[c][d]!=1)
{
if(s[c][d]=='S')
{
s[c][d]='0';
STEP=t.step;
}
if(isdigit(s[c][d])&&s[c][d]-'0'>0)sum+=s[c][d]-'0';
q.push(Node(c,d,t.step+1));
Visit[c][d]=1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
int starts1=0,starts2=0;
sum=0,STEP=1000005;
memset(starts,0,sizeof(starts));
memset(Visit,0,sizeof(Visit));
for(int i=0;i<n;i++)
scanf("%s",s[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(s[i][j]=='E'){starts1=i;starts2=j;}
printf("%d\n",BFS(starts1,starts2));
}
return 0;
}