HDU

题目:

链接

思路:

用BFS分别以‘Y’和‘M’的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到‘@’更行最小值。

PS:

如果用‘Y’和‘M’点分别去搜每个‘@’,这样妥妥的会超时。当时做这个题脑抽的一批……(烦!!!)

另外如果‘Y’和‘M’到不了‘@’这里的值为0,应该把这种情况排除。

代码:

//#include <bits/stdc++.h>
#include <queue>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define inf 0x3f3f3f3f
#define MAX 1000000000
#define mod 1000000000
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int maxn = 205;
char mp[maxn][maxn];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m;
int vis[maxn][maxn],sum[maxn][maxn];
struct Node{
    int x,y,cost;
};

bool isin(int x,int y){
    return x>=0&&x<n&&y>=0&&y<m;
}

void BFS(int x,int y){
    memset(vis,0,sizeof(vis));
    vis[x][y] = 1;
    queue<Node>que;
    que.push(Node{x,y,0});
    while(!que.empty()){
        Node u = que.front();
        que.pop();
        for(int i=0; i<4; i++){
            int tx = u.x+dx[i],ty = u.y+dy[i];
            if(isin(tx,ty) && !vis[tx][ty] && mp[tx][ty]!='#'){
                vis[tx][ty] = 1;
                sum[tx][ty] += u.cost+11;
                que.push(Node{tx,ty,u.cost+11});
            }
        }
    }
    return;
}

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=0; i<n; i++){
            scanf("%s",mp[i]);
        }
        memset(sum,0,sizeof(sum));
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(mp[i][j]=='Y'){
                    BFS(i,j);
                }else if(mp[i][j]=='M'){
                    BFS(i,j);
                }
            }
        }
        int ans = 1000000000;
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(mp[i][j]=='@' && sum[i][j]!=0){
                    ans = min(ans,sum[i][j]);
                }
            }
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sykline/p/10464460.html