CodeForces - 330D Biridian Forest
题意:MIkemon从S出发,要走到E,中途可能会遇到breeder,与breeder相遇时就要发生一场battle,一个格子可能有多个breeder,此时Mikemon就会与么以一个breeder发生一场battle,Mikemo提前设计好走出森林的路线,假设所有的breeder已经知道Mikemon走的路线,并且主动与Mikemon相遇并发生battle,在Mikemon每走一步的同时,breeder也走一步,求Mikemon与breeder发生的最小battle数
思路:如果Mikemon无论走那一条从S到E的路线,都会与某一个格子的breeder相遇,那么就说明这个格子的breeders会在Mikemon到达E之前或同时到达E点,所以我们从终点开始广搜,记录有breeder格子到终点的最短距离,如果距离比Mikemon到终点的距离不大说明可以相遇
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int n,m;
char a[1001][1001];
int vis[1001][1001];
int to[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int sx,sy,ex,ey;
int s[1001][1001];
int Min;
struct node{
int x,y,dis;
node(){}
node(int tx,int ty,int td){x=tx;y=ty;dis=td;}
};
int BFS(){
int ans=0;
queue<node> q;
q.push(node(ex,ey,0));
while(!q.empty()){
struct node t1;
t1=q.front();
q.pop();
for(int i=0;i<=3;i++){
int tx=t1.x+to[i][0];
int ty=t1.y+to[i][1];
int td=t1.dis+1;
if(vis[tx][ty]||tx<0||ty<0||tx>=n||ty>=m||a[tx][ty]=='T'){
continue;
}
s[tx][ty]=td;
if(tx==sx&&ty==sy){
Min=td;
}
vis[tx][ty]=1;
q.push(node(tx,ty,td));
}
}
}
int main(void){
memset(s,63,sizeof(s));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",a[i]);
for(int j=0;j<m;j++){
if(a[i][j]=='E'){
ex=i;
ey=j;
}
if(a[i][j]=='S'){
sx=i;
sy=j;
}
}
}
int ans=0;
BFS();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]>='1'&&a[i][j]<='9'&&s[i][j]<=Min){
ans+=(a[i][j]-'0');
}
}
}
printf("%d\n",ans);
return 0;
}