zoukankan      html  css  js  c++  java
  • HDU

    题意:给出两个人的位置,以及多个KFC位置, 障碍位置求能到达的最近KFC位置
    思路:两个位置搜索,然后记录到各KFC的时间信息,再选则最近的距离 最后得到的时总和的时间

    完整代码:

    
    
    #include <iostream>
    #include <cstdio>
    #include <cstring> 
    #include <algorithm>
    #include <queue>
    using namespace std;
    const int inf = 0x3f3f3f3f;
    char g[205][205];
    int vis[205][205],n,m,cnt;
    int mov[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
    struct node
    {
        int x;
        int y;
        int step;
    };
    node path1[1001];
    node path2[1001];
    void bfs(node s,node path[])
    {
        memset(vis,0,sizeof(vis));
        queue<node>q;
        q.push(s);
        while(!q.empty())
        {
            s=q.front();
            q.pop();
            if(g[s.x][s.y]=='@') path[cnt++]=s;
            for(int i=0;i<4;i++)
            {
                int nx=s.x+mov[i][0];
                int ny=s.y+mov[i][1];
                if(nx<0||ny<0||nx>=n||ny>=m||g[nx][ny]=='#') continue; //边界或障碍
                if(vis[nx][ny]) continue; // 已访问
                vis[nx][ny]=1;
                node nex;
                nex.x=nx,nex.y=ny,nex.step=s.step+1;
                q.push(nex);
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)==2)
        {
            memset(path1,0,sizeof(path1));
            memset(path2,0,sizeof(path2));
            cnt=0;
            getchar();
            int x1,y1,x2,y2;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    scanf("%c",&g[i][j]);
                    if(g[i][j]=='Y') x1=i,y1=j;
                    if(g[i][j]=='M') x2=i,y2=j;
                }
                getchar();
            }
            node s,e;
        	s.x=x1,s.y=y1,s.step=0;
            bfs(s,path1);
            int cnt1=cnt;
            cnt=0;
            s.x=x2,s.y=y2,s.step=0;
            bfs(s,path2);
            int cnt2=cnt;
            int Min=inf;
            for(int i=0;i<cnt1;i++)
            {
                for(int j=0;j<cnt2;j++)
                {
                     
                    if(path1[i].x==path2[j].x&&path1[i].y==path2[j].y)
                        Min=min(Min,11*(path1[i].step+path2[j].step));
                }
            }
            printf("%d
    ",Min);
        }
        return 0;
    }
     
  • 相关阅读:
    JAVA 多线程(3)
    JAVA 多线程(2)
    JAVA 多线程(1):synchronized
    阿里金服设置公钥-验证私钥
    linux (1): 启动
    新建项目虚拟环境及pycharm配置
    python创建udp服务端和客户端
    python创建tcp服务端和客户端
    python并发(阻塞、非阻塞、epoll)
    mongo基本操作
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11265542.html
Copyright © 2011-2022 走看看