CodeForces - 330D Biridian Forest(BFS+思维)

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值