zoukankan      html  css  js  c++  java
  • 【Gym 100971J】Robots at Warehouse

    题意

    链接
    给你一个n*m的地图,'#'代表墙,‘.’代表可走的,1代表1号机器人,2代表2号机器人,机器人可以上下左右移动到非墙的位置,但不能走到另一个机器人身上。问能否交换1和2的位置。

    分析

    如果1和2之间有路径且路径上某个点的度大于2,那就是YES,如果1和2的路径构成一个回路也是YES。其他情况就是NO。

    代码

    #include<cstdio>
    #define N 200005
    int n,m,ux,uy,ax,ay,a[N],u[N],ck,ans,fx[4]= {1,-1,0,0},fy[4]= {0,0,1,-1};
    char c;
    bool circle;
    void dfs(int x,int y,int s){
        if(x==ax&&y==ay)//走到终点
            ans++;
        if(x==ux&&y==uy&&s>2)//走回起点(s是第几步)
            circle = true;
        if(u[x*m-m+y]||ans>2||ans&&ck)return;
        u[x*m-m+y]=1;
        int r=0;
        for(int i=0;i<4;i++){
            int nx=x+fx[i];
            int ny=y+fy[i];
            if(nx&&nx<=n&&ny&&ny<=m&&a[nx*m-m+ny]){
                r++;//点的度
                if(r>2)ck=1;
                dfs(nx,ny,s+1);
            }
        }
    }
    int main(){
        scanf("%d%d ",&n,&m);
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                c=getchar();
                if(c!='#')
                    a[i*m-m+j]=1;
                if(c=='1')
                {
                    ux=i;
                    uy=j;
                }
                else if(c=='2')
                {
                    ax=i;
                    ay=j;
                }
            }
            getchar();
        }
        dfs(ux,uy,0);
        if(ans&&(ck||circle))printf("YES");
        else printf("NO");
        return 0;
    }
  • 相关阅读:
    Restful API
    Vue之指令
    Scrapy框架
    爬虫提高性能:串行、线程进程、异步非阻塞
    MongoDB
    Beautifulsoup模块
    请求库之selenium
    php 正则匹配中文
    Javascript的"预编译"思考
    PHP程序员面试技巧之口试题分享
  • 原文地址:https://www.cnblogs.com/flipped/p/5499754.html
Copyright © 2011-2022 走看看