zoukankan      html  css  js  c++  java
  • 小白月赛13 小A与小B (双向BFS)

    链接:https://ac.nowcoder.com/acm/contest/549/G
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    小A与小B这次两个人都被困在了迷宫里面的两个不同的位置,而他们希望能够迅速找到对方,然后再考虑如何逃离迷宫的事情。小A每次可以移动一个位置,而小B每次可以移动两次位置,小A移动的方向是上下左右左上左下右上右下8个方向,小B移动的方向是上下左右4个方向,请问他们最早什么时候能够找到对方,如果他们最终无法相遇,那么就输出”NO"。

    输入描述:

    NMN×M"C"A,"D"B"""."第一行两个整数N,M分别表示迷宫的行和列。接下来一个N×M的矩阵其中"C"表示小A的位置,"D"表示小B的的位置,"#"表示不可通过的障碍,"."则是可以正常通过的位置。字符用空格隔开

    输出描述:

    如果可以相遇,第一行输出一个YES,第二行一个整数输出最短的相遇时间。
    否则就输出一个NO表示不能相遇。
    示例1

    输入

    复制
    4 5
    . . . . .
    . # # # .
    . . . # D
    . . C # .
    

    输出

    复制
    YES
    3

    备注:

    1n,m10001≤n,m≤1000


    解题思路:将小A的起始位置与小B的起始位置都加入到队列中,同时跑BFS,判断是否走过对方已走过的位置,如果已走过,就结束就可以了。
    代码:
    #include<bits/stdc++.h>
    using namespace std;
    char mp[1005][1005];
    int n,m,vis[1005][1005];
    int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{1,1},{1,-1},{-1,1},{-1,-1}};
    struct node{
        int x,y,step,id;
        node(int aa,int bb,int a,int b){
            x=aa;
            y=bb;
            step=a;
            id=b;
        }
    };
    queue<node> que;
    int bfs(){
        while(que.size()){
            node now=que.front();
            que.pop();
            if(now.id==1){
                for(int i=0;i<8;i++){
                    int dx=now.x+dir[i][0];
                    int dy=now.y+dir[i][1];
                    if(vis[dx][dy]==2) return now.step+1;
                    if(dx>=0&&dx<n&&dy>=0&&dy<m&&mp[dx][dy]!='#'&&!vis[dx][dy]){
                        que.push(node(dx,dy,now.step+1,now.id));
                        vis[dx][dy]=now.id;
                    }
                }
            }else{
                for(int i=0;i<4;i++){
                    int dx=now.x+dir[i][0];
                    int dy=now.y+dir[i][1];
                    if(vis[dx][dy]==1) return now.step+1;
                    if(dx>=0&&dx<n&&dy>=0&&dy<m&&mp[dx][dy]!='#'){
                        vis[dx][dy]=now.id;
                        for(int i=0;i<4;i++){
                            int ddx=dx+dir[i][0];
                            int ddy=dy+dir[i][1];
                            if(vis[ddx][ddy]==1) return now.step+1;
                            if(ddx>=0&&ddx<n&&ddy>=0&&ddy<m&&mp[ddx][ddy]!='#'&&!vis[ddx][ddy]){
                                que.push(node(ddx,ddy,now.step+1,now.id));
                                vis[ddx][ddy]=now.id;
                            }
                        }
                    }
                }
            }
        }
        return -1;
    }
    int main(){
        cin>>n>>m;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                cin>>mp[i][j];
                if(mp[i][j]=='C'){
                    que.push(node(i,j,0,1));
                    vis[i][j]=1;
                }else if(mp[i][j]=='D'){
                    que.push(node(i,j,0,2));
                    vis[i][j]=2;
                }
            }
        int ans=bfs();
        if(ans==-1)puts("NO");
        else{
            puts("YES");
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    TensorFlow中的基本概念
    理解 tf.Variable、tf.get_variable以及范围命名方法tf.variable_scope、tf.name_scope
    深度神经网络关键词解释
    [python] os.path.join() 与 sys.path
    Git 遇到的坑
    [转] 资深程序员得到的职场经验教训
    VS CODE 快捷键
    解决VS Code使用code runner开发Python乱码问题
    熵,条件熵,互信息,交叉熵
    Visual Studio Code 支持TensorFlow配置支持
  • 原文地址:https://www.cnblogs.com/zjl192628928/p/10770592.html
Copyright © 2011-2022 走看看