• HDU 2602 Find a way BFS搜索


    题意:找到总时间最少的KFC

    分析:两遍BFS 找KFC比较一下

    注:有些地方的KFC可能到达不了,wa了一次

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string>
    #include <cmath>
    #include <set>
    #include <queue>
    #include <cstring>
    using namespace std;
    typedef long long LL;
    const int maxn=200+5;
    const int INF=0x3f3f3f3f;
    char s[maxn][maxn];
    int a[maxn][maxn];
    int b[maxn][maxn];
    int n,m;
    int dx[4]={0,0,-1,1};
    int dy[4]={-1,1,0,0};
    struct Point
    {
        int x,y;
        Point(){}
        Point(int p,int q)
        {
           x=p,y=q;
        }
    } o,t;
    queue<Point>Y,M;
    vector<Point>v;
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            v.clear();
            memset(a,-1,sizeof(a));
            memset(b,-1,sizeof(b));
            for(int i=1;i<=n;++i)
             scanf("%s",s[i]+1);
            for(int i=1;i<=n;++i)
            {
               for(int j=1;j<=m;++j)
               {
                  if(s[i][j]=='@')v.push_back(Point(i,j));
                  else if(s[i][j]=='Y')Y.push(Point(i,j)),a[i][j]=0;
                  else if(s[i][j]=='M')M.push(Point(i,j)),b[i][j]=0;
               }
            }
            while(!Y.empty())
            {
                o=Y.front();
                Y.pop();
                for(int i=0;i<4;++i)
                {
                   t.x=o.x+dx[i];
                   t.y=o.y+dy[i];
                   if(t.x<1||t.x>n||t.y<1||t.y>m)continue;
                   if(s[t.x][t.y]=='#'||a[t.x][t.y]>=0)continue;
                   a[t.x][t.y]=a[o.x][o.y]+1;
                   Y.push(t);
                }
            }
             while(!M.empty())
            {
                o=M.front();
                M.pop();
                for(int i=0;i<4;++i)
                {
                   t.x=o.x+dx[i];
                   t.y=o.y+dy[i];
                   if(t.x<1||t.x>n||t.y<1||t.y>m)continue;
                   if(s[t.x][t.y]=='#'||b[t.x][t.y]>=0)continue;
                   b[t.x][t.y]=b[o.x][o.y]+1;
                   M.push(t);
                }
            }
            int ans=INF;
            for(int i=0;i<v.size();++i)
            {
                int x=v[i].x,y=v[i].y;
                if(a[x][y]==-1||b[x][y]==-1)continue;
                ans=min(ans,a[x][y]+b[x][y]);
            }
            printf("%d
    ",ans*11);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    单例模式创建
    盛最多水的容器
    魔术索引
    钢条切割
    比较版本号
    矩阵中的路径
    机器人的运动范围
    计网基础问题
    Linux 下android环境的配置
    Fedora15下安装Android开发环境
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/5173098.html
Copyright © 2020-2023  润新知