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;
    }
  • 相关阅读:
    正则表达式常用公式
    造轮子之--Redis
    SqlServer 查询计划分析
    实现poster,json,base64等编码转码工具
    win nginx + php bat启动/停止脚本
    php设计模式——单例模式
    [php]php设计模式 (总结)
    升级openssl 操作记录
    PHP URL安全的Base64位编码
    php curl使用 常用操作
  • 原文地址:https://www.cnblogs.com/flipped/p/5499754.html
Copyright © 2011-2022 走看看