杭电2612

请注意一次把所有可到达的点所花最短时间算一遍,比每找到@再寻找快!!!

一次一次找就会超时!!!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
char mapp[210][210];
#define inf 100000000
int n,m;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
int pos1x,pos1y,pos2x,pos2y,posdx,posdy;
int visit[210][210];
int dist1[210][210],dist2[210][210];
struct stu
{
	int x,y,step;
};
int BFS(stu stu1,int dist[][210])
{
	int i;
	queue<stu>k;
	stu stu2;
	memset(visit,0,sizeof(visit));  
    memset(dist,0,sizeof(dist)); 
	k.push(stu1);
	while(!k.empty())
	{
		stu1=k.front();
		k.pop();
		for(i=0;i<4;i++)
		{
			stu2.x=stu1.x+dir[i][0];
			stu2.y=stu1.y+dir[i][1];
			stu2.step=stu1.step+11;
			if(stu2.x>=0&&stu2.x<n&&stu2.y>=0&&stu2.y<m&&visit[stu2.x][stu2.y]!=1&&mapp[stu2.x][stu2.y]!='#')
			{
				visit[stu2.x][stu2.y]=1;
				dist[stu2.x][stu2.y]=stu2.step;
				k.push(stu2);
			}
		}
	}
}
int main()
{
	int i,j,sum,Min;
	stu stu1;
	while(~scanf("%d%d",&n,&m))
	{
		Min=inf;
		for(i=0;i<n;i++)
		{
			cin>>mapp[i];
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(mapp[i][j]=='Y')
				{
					pos1x=i;
					pos1y=j;
				}
				if(mapp[i][j]=='M')
				{
					pos2x=i;
					pos2y=j;
				}
			}
		}
		stu1.x=pos1x;
		stu1.y=pos1y;
		stu1.step=0;
		BFS(stu1,dist1);		//第一个人所有可到达的点所花最短时间 
		stu1.x=pos2x;
		stu1.y=pos2y;
		stu1.step=0;
		BFS(stu1,dist2);		//第二个人所有可到达的点所花最短时间  
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(mapp[i][j]=='@')
				{
				if(dist1[i][j]!=0&&dist2[i][j]!=0)
				{
					Min=min(dist1[i][j]+dist2[i][j],Min); 
				}
				}
			}
		}
		cout<<Min<<endl;
	}
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值