zoukankan      html  css  js  c++  java
  • 小A与小B

    大意:小A小B从两个点出发,想尽快相见,求最短时间。


    思路: 同时对小A和小B进行bfs,相遇了就直接输出,一直遇不到就是NO,详细的写到注释里了。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <stack>
    #include <queue>
    #include <cmath>
    #define ll long long
    #define pi 3.1415927
    #define inf 0x3f3f3f3f
    #define mod 1000000007
    using namespace std;
    int n,m,ax,ay,bx,by;
    struct node{
        int a,b;
        char m;
    }maps[1005][1005]; ///a,b用来记录他们是否走过这里,m用来记录地图的#和. 
    struct que{
        int x,y;
    }pa,pb;
    queue<que> a,b;
    int bfs()
    {
        ///把小A和小B的起点存到队列a和b里
        pa.x=ax,pa.y=ay;
        a.push(pa);
        maps[ax][ay].a=1;
        
        pb.x=bx,pb.y=by;
        b.push(pb);
        maps[bx][by].b=1;
        
        int time=1; ///记录时间
        int xx[]={0,0,1,-1,1,1,-1,-1},yy[]={1,-1,0,0,-1,1,-1,1};
        while(time)
        {
            int len=a.size();
            while(len--){   ///将上次存到队列里的走完
                pa=a.front();a.pop();
                for(int i=0;i<8;++i)
                {
                    int xa=pa.x+xx[i], ya=pa.y+yy[i];  ///下一步的坐标
                    if(maps[xa][ya].m=='#' || xa<1 ||xa>n ||ya<1 ||ya>m || maps[xa][ya].a==1)
                        continue;
                    maps[xa][ya].a=1;
                    a.push({xa,ya});
                    if(maps[xa][ya].b==1)  ///如果b走过这里说明可以相遇了,直接返回时间输出
                        return time;
                }
            }
            for(int t=1;t<=2;++t){ ///小B可以走两次
                len=b.size();
                while(len--){
                pb=b.front();b.pop();
                for(int i=0;i<4;++i)
                    {
                    int xb=pb.x+xx[i], yb=pb.y+yy[i];
                    if(maps[xb][yb].m=='#' || xb<1 ||xb>n ||yb<1 ||yb>m || maps[xb][yb].b==1)
                        continue;
                    maps[xb][yb].b=1;
                    b.push({xb,yb});
                    if(maps[xb][yb].a==1)
                        return time;
                    }
                }
            }
            time++;
        }
        return 0;
    }
    int main ()
    {
        int i,t,j,k;
        cin>>n>>m;
        for(i=1;i<=n;++i)
            for(t=1;t<=m;++t){
                cin>>maps[i][t].m;
                if(maps[i][t].m=='C')
                    ax=i,ay=t;
                if(maps[i][t].m=='D')
                    bx=i,by=t;
            }
        k=bfs();
        if(k)
            cout<<"YES"<<endl<<k<<endl;
        else
            cout<<"NO"<<endl;
    
        return 0;
    }
  • 相关阅读:
    降维-基于RDD的API
    GraphX编程指南
    GPU自动调度卷积层
    TVM部署预定义模型
    做个普通人,就挺好的
    Spring 的 @Primary 注解
    微信公众平台消息接口开发(30)大众点评商户信息团购及优惠券查询
    大众点评API获取某坐标周边酒店信息
    Sharding-jdbc 读写分离(三)- springboot+mybatis+Hikari
    Sharding-jdbc 分库分表专题内容(二)springboot+mybatis+Hikari
  • 原文地址:https://www.cnblogs.com/blowhail/p/13044011.html
Copyright © 2011-2022 走看看