• Hdu2612Find a way bfs


    题意: 两人任选一家 kfc店 ,然后两人走去那里,求可以选择的kfc店使得两人走的距离和最短。

    分别以俩人 为原点跑遍bfs,  刚开始 maxn 开到222  挂了,然后改成333 就过了。。。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    #include<math.h>
    using namespace std;
    const int INF=0xfffffff;
    const int maxn=222;
    int n,m;
    int bx,by,ex,ey;
    int vis[maxn][maxn];
    int dis[maxn][maxn];
    int Hash[maxn][maxn];
    int d[maxn][maxn];
    int sum;
    int gg[maxn*maxn];
    char str[maxn][maxn];
    int gaomaoxian(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y]&&str[x][y]!='#') return 1;
        return 0;
    }
    int dx[]={0,0,-1,1};
    int dy[]={-1,1,0,0};
    void  gao()
    {
        memset(vis,0,sizeof(vis));
        dis[bx][by]=0;
        for(int i=0;i<sum;i++)
            d[1][i]=INF;
        vis[bx][by]=1;
        queue<int> q;
        q.push(bx*m+by);
        while(!q.empty()){
            int cur=q.front();
            q.pop();
            int xx=cur/m;int yy=cur%m;
            if(str[xx][yy]=='@'){
                d[1][Hash[xx][yy]]=dis[xx][yy],vis[xx][yy]=1;gg[Hash[xx][yy]]=1;
            }
            for(int i=0;i<4;i++){
                int x1=xx+dx[i];int y1=yy+dy[i];
                if(!gaomaoxian(x1,y1)) continue;
                vis[x1][y1]=1;
                dis[x1][y1]=dis[xx][yy]+1;
                q.push(x1*m+y1);
            }
        }
    }
    
    void gao1()
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<sum;i++)
        dis[2][i]=INF;
        dis[ex][ey]=0;
        vis[ex][ey]=1;
        queue<int> q;
        q.push(ex*m+ey);
        while(!q.empty()){
            int cur=q.front();q.pop();
            int xx=cur/m;int yy=cur%m;
            if(str[xx][yy]=='@'){
                    d[2][Hash[xx][yy]]= dis[xx][yy],vis[xx][yy]=1; gg[Hash[xx][yy]]=1;
            }
            for(int i=0;i<4;i++){
                int x1=xx+dx[i];int y1=yy+dy[i];
                if(!gaomaoxian(x1,y1)) continue;
                vis[x1][y1]= 1;
                dis[x1][y1]=dis[xx][yy]+1;
                q.push(x1*m+y1);
            }
        }
    }
    
    int main()
    {
        while(cin>>n>>m){
            int sum=0;
            memset(gg,0,sizeof(gg));
            for(int i=0;i<n;i++){
                scanf("%s",str[i]);
                for(int j=0;j<m;j++){
                    if(str[i][j]=='M'){
                        bx= i; by=j;
                    }
                    if(str[i][j]=='Y'){
                        ex=i;ey=j;
                    }
                    if(str[i][j]=='@'){
                        Hash[i][j]=sum++;
                    }
                }
            }
            gao();gao1();
            int ans= INF;
            for(int i=0;i<sum;i++){
                if(!gg[i]) continue;
                int ans1=d[1][i]+d[2][i];
              //  printf("%d %d
    ",d[1][i],d[2][i]);
                ans= min(ans,ans1);
            }
            cout<<ans*11<<endl;
        }
        return 0;
    }
  • 相关阅读:
    jqueryUI弹出框问题
    spring data jpa分页
    解决eclipse编辑js和html卡的问题
    web.xml添加编码过滤器
    Apache SolrCloud安装
    搭建zookeeper集群
    html页面读取PDF小案例
    .NET 使用Process调用7_zip解压文件
    .NET 中三种正确的单例写法
    Git 笔记
  • 原文地址:https://www.cnblogs.com/yigexigua/p/3955105.html
Copyright © 2020-2023  润新知