HDU 2612 Find a way(双层BFS)

传送门

题目大概的意思就是两个人Y和M约在KFC见面,找到一家KFC使得两个人到达时的距离之和最短,并且Y不能经过M的出发地,M不能经过Y的出发地。

思路也很清晰,用两次BFS,找出Y和M分别到每个KFC所需要的时间,然后把两个人到达每个KFC需要的时间加起来,找出最小值,这个最小值就是题目要求的值,附代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char mp[1010][1010];
int vis[1010][1010],step1[1010][1010],step2[1010][1010],n,m;
int mv[4][2] = {0,1,0,-1,1,0,-1,0};
typedef pair <int,int> P;
void bfs(int a,int b,int c,int d,int step[1010][1010])
{
    P que[220*220];
    int frt = 0,til = 0;
    que[til].first = a;
    que[til++].second = b;
    vis[a][b] = 1;
    step[a][b] = 0;
    while(frt < til)
    {
        P p = que[frt];
        int next_x,next_y;
        for(int i = 0;i < 4; i++)
        {
            next_x = p.first + mv[i][0];
            next_y = p.second + mv[i][1];
            if(next_x == c && next_y == d)
                continue;
            if(next_x >= 0 && next_x < n && next_y >= 0 && next_y < m && mp[next_x][next_y] != '#' && !vis[next_x][next_y])
            {
                que[til].first = next_x;
                que[til].second = next_y;
                vis[next_x][next_y] = 1;
                til++;
                step[next_x][next_y] = step[p.first][p.second] + 1;
            }
        }
        frt++;
    }
}
int main()
{
    int yx,yy,mx,my;
    while(scanf("%d %d",&n,&m) != EOF)
    {
        memset(vis,0,sizeof(vis));
        getchar();
        for(int i = 0;i < n; i++)
        {
            scanf("%s",mp[i]);
            getchar();
            for(int j = 0;j < m; j++)
            {
                if(mp[i][j] == 'Y')
                    yx = i,yy = j;
                if(mp[i][j] == 'M')
                    mx = i,my = j;
            }
        }
        bfs(mx,my,yx,yy,step1);
        memset(vis,0,sizeof(vis));
        bfs(yx,yy,mx,my,step2);
        int ans = 0x3f3f3f3f;
        for(int i = 0;i < n; i++)
        {
            for(int j = 0;j < m; j++)
            {
                if(mp[i][j] == '@')
                {
//                    printf("%d %d %d %d\n",i,j,step1[i][j],step2[i][j]);
                    int he = step1[i][j] + step2[i][j];
                    if(he < ans)
                        ans = he;
                }
            }
        }
        printf("%d\n",ans * 11);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao__hei__hei/article/details/84708777