CodeForces

来源:互联网 发布:软件开发技术手册 编辑:程序博客网 时间:2024/06/03 19:01

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;}


原创粉丝点击