HDU 2612 Find a way(bfs)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccutsoft20144264/article/details/49979683

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2612

题意:Y和M想在某家KCF见面,求他们到某家KCF的时间花费最少为多少。

“#”为墙,“@”为KFC,“.“为路,每步花费1时间。

思路:分别以Y,M为起点进行两次bfs,得出他们到每一家KFC的时间,分别用两个数组统计time1、time2,最后通过for循环比较出time1+time2的最小值。注意走过的路要进行标记,还要注意初始化,注意越界。由于有多家KFC,所以当搜到“@”时还要再继续搜下去,不要忘记标记它和把它扔到队列里。

code:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<queue>
#define INF 0x3f3f3f 
using namespace std;
int n,m,x1,y1,x2,y2;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int vis[200][200],flag;
int time1[200][200];
int time2[200][200];
string map[200];
struct node
{
	int x,y,step;
}ll,t;
void bfs(int x,int y)
{
	queue<node> q;
	ll.x=x;
	ll.y=y;
	ll.step=0;
	q.push(ll);
	while(!q.empty())
	{
		t=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int a=t.x+dx[i];
			int b=t.y+dy[i];
			int s=t.step;
			if(a<0||a>n||b<0||b>m||vis[a][b]||map[a][b]=='#')
				continue;
			else if(map[a][b]=='@')
			{
				if(flag==1)
				{
					if(s+1<time1[a][b])
						time1[a][b]=s+1;
				}
				else if(flag==2)
				{
					if(s+1<time2[a][b])
						time2[a][b]=s+1;	
				}
			}
			vis[a][b]=1;
			ll.x=a;
			ll.y=b;
			ll.step=s+1;
			q.push(ll);
		}
	}
}
int main()
{
	while(cin>>n>>m)
	{
		for(int i=0;i<n;i++)
			cin>>map[i];
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++)
			{
				if(map[i][j]=='Y')
				{
					x1=i;
					y1=j;
				}
				else if(map[i][j]=='M')
				{
					x2=i;
					y2=j;
				}
			}
		memset(vis,0,sizeof(vis));
		memset(time1,INF,sizeof(time1));
		flag=1;
		bfs(x1,y1);
		memset(vis,0,sizeof(vis));
		memset(time2,INF,sizeof(time2));
		flag=2;
		bfs(x2,y2);
		int minn=INF;
		for(int i=0;i<n;i++)
		    for(int j=0;j<m;j++)
		    {
    			if(time1[i][j]!=INF&&time2[i][j]!=INF)
		            minn=min(time1[i][j]+time2[i][j],minn);
    		} 
      	cout<<minn*11<<endl;
	}
	return 0;
}

提交的时候交C++显示编译错误,交G++ AC。

猜你喜欢

转载自blog.csdn.net/ccutsoft20144264/article/details/49979683