HDU 2612 -Find a way (注意细节的BFS)

题目链接:Find a Way

题目不难,前几天做,当时准备写双向BFS的,后来处理细节上出了点问题,赶上点事搁置了,今天晚上重写的,没用双向,用了两次BFS搜索,和双向BFS 道理差不多,只是这题有个小坑,需要注意

1.Y不能经过M,M不能经过Y,也就是说有Y和M的格子,可以默认为是墙

2.必须是Y和M都能到达的KFC才行,只是其中一个到达不行


例如下列数据;答案既不是22 也不是 88 而是110,左下角的KFC满座条件

5 5
Y..#@
...M.
....#
.....
@....
小小的坑我了一下。。。。

感谢昵称: zstu_JayYe杰 不是看了他在Discuss板里的留言,估计我也想不到

31MS852K

代码很渣,哗哗。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
const int N = 1e6;
const int M = 220;
using namespace std;
char mapp[M][M];
bool vis1[M][M],vis2[M][M];
int dis1[M][M],dis2[M][M],n,m,l;
struct node
{
	int x,y,a;
	node()
	{  x = 0; y = 0;a = 0;  }
};
struct noDe{
    int x,y;
}kfc[40010];
int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void BFS(int x,int y,bool visit[M][M],int ans[M][M])
{
    node f,t;
    queue<node>q;
    visit[x][y]=true;
    f.a = 0;
	f.x=x;
	f.y=y;
	q.push(f);
	while(!q.empty())
	{
        t = q.front();
		 q.pop();
		 if(mapp[t.x][t.y]=='@')
             ans[t.x][t.y] = t.a;
		 for(int i=0;i<4;i++)
		 {
			 f.x=t.x+mv[i][0];
			 f.y=t.y+mv[i][1];
			 if(!visit[f.x][f.y]&&0<=f.x&&f.x<n&&0<=f.y&&f.y<m&&mapp[f.x][f.y]!='#')
			 {
				 f.a = t.a + 1;
				 visit[f.x][f.y]=true;
				 q.push(f);
			 }
		 }
	}
}
int main()
{
	int sx,sy,ex,ey;
	int minn;
	while(~scanf("%d%d%*c",&n,&m))
	{
	    l = 0;
		for(int i=0;i<n;i++)
        {
            scanf("%s",mapp[i]);
            for(int j=0;j<m;j++)
		  {
			if(mapp[i][j]=='Y')
			{
				sx=i;  sy=j;
				mapp[i][j]='#';
			}
			else if(mapp[i][j]=='M')
			{
			    mapp[i][j]='#';
				ex=i;  ey=j;
			}
			else if(mapp[i][j]=='@')
            {
                kfc[l].x = i; kfc[l++].y = j;
            }
		  }
        }
		memset(vis1,0,sizeof(vis1));
     	memset(dis1,0,sizeof(dis1));
        BFS(sx,sy,vis1,dis1);
		memset(vis2,0,sizeof(vis2));
     	memset(dis2,0,sizeof(dis2));
		BFS(ex,ey,vis2,dis2);
		minn=N;
		for(int i = 0;i<l;i++)
        {
            if(minn > dis1[kfc[i].x][kfc[i].y] + dis2[kfc[i].x][kfc[i].y])
                if(dis1[kfc[i].x][kfc[i].y]!=0&&dis2[kfc[i].x][kfc[i].y]!=0)
                minn = dis1[kfc[i].x][kfc[i].y] + dis2[kfc[i].x][kfc[i].y];
        }
		printf("%d\n",minn*11);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值