Find a way HDU - 2612 (简单BFS)

题目链接:https://cn.vjudge.net/problem/HDU-2612

题意:Y和M约在一家KFC碰面,问他俩到KFC的时间和 最少是多少

思路:bfsY到每个KFC的最短时间,bfsM到每个KFC的最短时间,然后遍历每个KFC他俩到达的时间和,找到最小的即可

注意:1.可能出现KFC被墙围起来的情况,俩人都到不了,把时间赋初值的时候赋为INF即可

          2. 除了墙的位置,他俩都可以走到 比如,Y可以经过M的位置

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <stack>
#include <algorithm>
#include <cmath>
#include <map>
#define mem(a,b) memset(a,b,sizeof(a));
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
const int maxn = 5000005;
int n,m,suma,vis1[205][205],vis2[205][205],sum1[205][205],sum2[205][205];
string s[205];
struct node {
    int x,y,num;
    node(int x1,int y1,int n):x(x1),y(y1),num(n){};
};
void BFS1(int x,int y) {//找到Y到KFC的最短时间
    vis1[x][y] = 1;
    queue<node>q;
    q.push(node(x,y,0));
    int sum = 0;
    while(!q.empty()) {
        node temp = q.front();
        q.pop();
        if(s[temp.x][temp.y] == '@')
            sum++;
        if(sum == suma) {
            break;
        }
        for(int i = 0; i < 4; i++) {
            int fx = temp.x + dir[i][0], fy = temp.y + dir[i][1];
            if(fx >=0 && fx < n && fy >= 0 && fy < m && !vis1[fx][fy] && s[fx][fy] != '#')
            {
                vis1[fx][fy] = 1;
                sum1[fx][fy] = temp.num + 1;
                q.push(node(fx,fy,temp.num+1));
            }
        }
    }
}
void BFS2(int x,int y) {//找到M到KFC的最短时间
    vis2[x][y] = 1;
    queue<node>q;
    q.push(node(x,y,0));
    int sum = 0;
    while(!q.empty()) {
        node temp = q.front();
        q.pop();
        if(s[temp.x][temp.y] == '@')
            sum++;
        if(sum == suma) {
            break;
        }
        for(int i = 0; i < 4; i++) {
            int fx = temp.x + dir[i][0], fy = temp.y + dir[i][1];
            if(fx >=0 && fx < n && fy >= 0 && fy < m && !vis2[fx][fy] && s[fx][fy] != '#')
            {
                vis2[fx][fy] = 1;
                sum2[fx][fy] = temp.num + 1;
                q.push(node(fx,fy,temp.num+1));
            }
        }
    }
}
int main()
{
    while(cin >> n >> m) {
        mem(vis1,0);
        mem(vis2,0);
        mem(sum1,INF);//最短时间赋为无穷大
        mem(sum2,INF);
        for(int i = 0; i < n; i++) {
            cin >> s[i];
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(s[i][j] == '@')
                    suma++;
            }
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(s[i][j] == 'Y')
                    BFS1(i,j);
                if(s[i][j] == 'M')
                    BFS2(i,j);
            }
        }
        int ans = INF;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(s[i][j] == '@') {//遍历每个KFC
                    ans = min(ans,sum1[i][j] + sum2[i][j]);
                }
            }
        }
        cout << ans*11 << endl;
    }
    return 0;
}

 

posted on 2019-08-19 16:18  一只小毛球  阅读(480)  评论(0编辑  收藏  举报

导航