• HDU 2612 find a way 【双BFS】


    <题目链接>

    题目大意:
    两个人分别从地图中的Y 和 M出发,要共同在 @ 处会面(@不止有一处),问这两个人所走距离和的最小值是多少。

    解题分析:

    就是对这两个点分别进行一次BFS,求出它们到每一个 @ 点的最短距离,然后距离和最小的即为所求(图上一步相当于 11)。此题有坑,必须判断两个人是否都能够走到那个@点,如果不能走到,那么那个距离和应该作废。

    #include<iostream>
    #include<queue>
    #include<algorithm>
    #include<memory.h>
    #include<utility>
    using namespace std;
    typedef pair<int,int> P;
    const int MAX=201;
    int dir[4][2]={1,0,0,1,-1,0,0,-1};
    char maze[MAX][MAX];
    int visa[MAX][MAX],visb[MAX][MAX];
    int n,m;
    void bfs(int x,int y,int vis[][MAX])
    {
        queue<P>q;
        q.push(P(x,y));
        while(!q.empty())
        {
            P p=q.front();
            q.pop();
            for(int i=0;i<4;i++) {
                int nx=p.first+dir[i][0],ny=p.second+dir[i][1];
                if(nx>=0&&ny>=0&&nx<n&&ny<m&&maze[nx][ny]!='#'&&vis[nx][ny]==0) {
                        vis[nx][ny]=vis[p.first][p.second]+11;
                        q.push(P(nx,ny));
                }
            }
        }
    }
    
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            int a,b,c,d;
            memset(visa,0,sizeof(visa));
            memset(visb,0,sizeof(visb));
            for(int i=0;i<n;i++){
                scanf("%s",&maze[i]);
                for(int j=0;j<m;j++) {
                    if(maze[i][j]=='Y') {
                        a=i,b=j;
                    }
                    if(maze[i][j]=='M') {
                        c=i,d=j;
                    }
                }
            }
            bfs(a,b,visa);
            bfs(c,d,visb);
            int mini=0x3f3f3f3f;
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                    if(maze[i][j]=='@'&&visa[i][j]+visb[i][j]!=0)      //未到达的KFC
                        mini=min(mini,visa[i][j]+visb[i][j]);
            cout<<mini<<endl;
        }
       return 0;
    }

    这是我的代码,WA了,但是不知道为什么,先记录下来。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    
    const int maxn=200+50;
    #define INF 0x3f3f3f3f
    
    int n,m;
    char mpa[maxn][maxn];
    int vis[maxn][maxn];
    int dis[maxn];
    int arrive[maxn];
    
    int dir[][2]={1,0,0,1,-1,0,0,-1};
    
    struct NODE{
        int x,y;
        NODE(int a=0,int b=0){
            x=a,y=b;
        }
    };
    vector<NODE>v;
    
    struct node{
        int x,y;
        int step;
        node(int a=0,int b=0,int c=0):x(a),y(b),step(c){}
    };
    
    void bfs(node ital){
        memset(vis,0,sizeof(vis));
        queue<node>q;
        q.push(ital);
        vis[ital.x][ital.y]=1;
        while(!q.empty()){
            node now=q.front();
            q.pop();
            if(mpa[now.x][now.y]=='@'){
                for(int i=0;i<v.size();i++){
                    if(v[i].x==now.x&&v[i].y==now.y){
                        dis[i]+=now.step;
                        arrive[i]++;
                    }
                }
            }
            for(int k=0;k<4;k++){
                int xx=now.x+dir[k][0];
                int yy=now.y+dir[k][1];
                if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||mpa[xx][yy]=='#')continue;
                if(mpa[xx][yy]=='Y'||mpa[xx][yy]=='M')continue;
                vis[xx][yy]=1;
                q.push(node(xx,yy,now.step+1));
            }
        }
    }
    
    int main(){
        while(scanf("%d %d",&n,&m)!=EOF){
            v.clear();
            for(int i=1;i<=n;i++){
                scanf("%s",mpa[i]+1);
                for(int j=1;j<=m;j++){
                    if(mpa[i][j]=='@'){
                        v.push_back(NODE(i,j));     //将全部 @单独地存到vector中,这样会给每一个@编号,方便查询  
                    }
                }
            }
            memset(arrive,0,sizeof(arrive));
            memset(dis,0,sizeof(dis));
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(mpa[i][j]=='Y'||mpa[i][j]=='M'){
                        bfs(node(i,j,0));
                    }
                }
            }
            int mx=INF;
            for(int i=0;i<v.size();i++){
                if(arrive[i]!=2)dis[i]=INF;         //如果这个KFC不是两个人都能到达,那么求出来的dis无效,所以将其设为INF 
                mx=min(mx,dis[i]);
            }
            printf("%d
    ",mx*11);
        }
        return 0;
    }
    View Code

    2018-08-29

  • 相关阅读:
    从C#角度 单例模式 懒汉和饿汉
    从C#角度 理解MVC原理
    总结下 简单工厂-》工厂-》抽象工厂
    尝试加载Oracle客户端库时引发BadImageFormatException
    org.springframework.dao.DuplicateKeyException: 问题
    写出严谨的代码
    Spring基础入门之IoC注入
    javaIO流小结(1)
    java入门之异常处理小结
    static关键字使用
  • 原文地址:https://www.cnblogs.com/00isok/p/9557406.html
Copyright © 2020-2023  润新知