• 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;
    }
  • 相关阅读:
    Vue-cli3中导入Cesium并配置
    Intellij IDEA中安装插件的两种方式
    Docker01——Ubuntu上安装Docker
    Java反射02——动态代理
    Java反射01——基本概念
    Docker安全配置问题
    马踏棋盘里面的一些小问题
    马踏棋盘算法用Java语言实现
    Android 中AIDL的使用与理解
    数据库技术中的触发器(Trigger)——和ContentObserver功能类似
  • 原文地址:https://www.cnblogs.com/sykline/p/10464460.html
Copyright © 2020-2023  润新知