hdu 2612 Find a way

点击打开链接

两个BFS即可。。


#include"stdio.h"
#include"string.h"
#include"queue"
#define N 205
using namespace std;
char str[N][N];
int n,m,a1[1004]={0},a2[1004]={0};
int sum,k,b1[1004]={0},b2[1004]={0};
int map[N][N];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node 
{
	int x,y,step;
};
struct ss
{
	int x,y;
}s[1004];
int join(int x,int y)
{
	int i;
	for(i=1;i<k;i++)
		if(s[i].x==x&&s[i].y==y)
			return i;
		return -1;
}
void bfs1(int x,int y)
{
	queue<node>Q;
	node q,p;
	p.x=x;
	p.y=y;
	p.step=0;
	memset(map,0,sizeof(map));
	int t,i;
	map[x][y]=0;
	Q.push(p);
	while(!Q.empty())
	{
		p=Q.front();
		Q.pop();
		t=join(p.x,p.y);
		if(t)
		{
			map[p.x][p.y]=1;
			a1[t]=p.step;
		}
		for(i=0;i<4;i++)
		{
			q=p;
			q.x+=dir[i][0];
			q.y+=dir[i][1];
			q.step+=11;
			if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m
				&&!map[q.x][q.y]&&str[q.x][q.y]!='#')
			{
				map[q.x][q.y]=1;
				Q.push(q);
			}
		}
		for(i=1;i<k;i++)
		{
			if(a1[i])b1[i]=a1[i];
			else b1[i]=-1;
		}
	}
}
void bfs2(int x,int y)
{
	queue<node>Q;
	node q,p;
	p.x=x;
	p.y=y;
	p.step=0;
	memset(map,0,sizeof(map));
	int t,i;
	map[x][y]=0;
	Q.push(p);
	while(!Q.empty())
	{
		p=Q.front();
		Q.pop();
		t=join(p.x,p.y);
		if(t)
		{
			map[p.x][p.y]=1;
			a2[t]=p.step;
		}
		for(i=0;i<4;i++)
		{
			q=p;
			q.x+=dir[i][0];
			q.y+=dir[i][1];
			q.step+=11;
			if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m
				&&!map[q.x][q.y]&&str[q.x][q.y]!='#')
			{
				map[q.x][q.y]=1;
				Q.push(q);
			}
		}
		for(i=1;i<k;i++)
		{
			if(a2[i])b2[i]=a2[i];
			else b2[i]=-1;
		}
	}
}
int main()
{
	int i,j;
	int x1,x2,y1,y2,min;
	while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
	{
		k=1;
		min=100000;
		for(i=0;i<n;i++)
			scanf("%s",str[i]);
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				if(str[i][j]=='Y')
				{
					x1=i;y1=j;
				}
				if(str[i][j]=='M')
				{
					x2=i;y2=j;
				}
				if(str[i][j]=='@')
				{
					s[k].x=i;
					s[k++].y=j;
				}
			}
		}
			bfs1(x1,y1);
			bfs2(x2,y2);
			for(i=1;i<k;i++)
			{
				if(b1[i]!=-1&&b2[i]!=-1)
				{
					sum=b1[i]+b2[i];
					if(min>sum)
						min=sum;
				}
			}
			printf("%d\n",min);
	}
	return 0;
}







posted on 2012-07-20 10:22  Slege  阅读(90)  评论(0编辑  收藏  举报

导航