zoukankan      html  css  js  c++  java
  • 【HIHOCODER 1575】 两个机器人(BFS)

    描述


    一个N × M的2D迷宫中有两个机器人。机器人A在迷宫左上角,只能向右或向下移动;机器人B在迷宫右下角,只能向左或向上移动。机器人不能移动到迷宫外。此外,由于奇怪的同步机制,这两个机器人只能同时向相反的方向移动。也就是说或者机器人A向右同时机器人B向左;或者机器人A向下同时机器人B向上移动。
    迷宫中有一些格子存在障碍,机器人不能移动到有障碍的格子上。如果某个机器人的移动方向上的下一个格子有障碍,它会停在当前格子上;这时另一个机器人不受影响,仍能向相反方向移动。迷宫范围之外可以视为全部都是障碍。
    此外,两个机器人在移动中不能“相撞”。相撞是指:

    1. 两个机器人同时处在同一个格子上;
    2. 两个机器人在一次移动中互换位置。
      小Hi想知道,最少经过多少次移动可以使机器人A走到右下角,同时机器人B走到左上角。

    输入


    第一行包含两个正整数N和M。 (1 ≤ N, M ≤ 50)
    以下是一个N × M的01矩阵,其中0表示格子上没有障碍,1表示格子上有障碍。
    1 x u
    2 x
    第一种表示将第x号节点的权值修改为u
    第二种表示询问以第x号节点为根的子树中,最小的权值是多少。
    对于30%的数据,1 ≤ N, Q ≤ 1000
    对于100%的数据,1 ≤ N, Q ≤ 100000, -109 <= Vi, u <= 109

    输出


    输出一个整数代表最少移动的步数。如果目标不能达成,输出-1。

    样例输入

    5 5  
    00001  
    00000  
    00100  
    01000  
    00000
    

    样例输出

    9
    

    题解


    直接搜索。。。

    #include <queue>
    #include <cmath>
    #include <cstdio>
    #include <complex>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #define ll long long
    #define inf 1000000000
    #define PI acos(-1)
    #define bug puts("here")
    #define REP(i,x,n) for(int i=x;i<=n;i++)
    #define DEP(i,n,x) for(int i=n;i>=x;i--)
    #define mem(a,x) memset(a,x,sizeof(a))
    using namespace std;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    inline void Out(int a){
        if(a<0) putchar('-'),a=-a;
        if(a>=10) Out(a/10);
        putchar(a%10+'0');
    }
    const int N=55;
    char map[N][N];
    bool vis[N][N][N][N];
    int next1[2][2]={1,0,0,1};
    int next2[2][2]={-1,0,0,-1};
    int n,m;
    struct node{
        int x1,y1;
        int x2,y2;
        int step;
        node(){}
        node(int t1,int t2,int t3,int t4){
            x1=t1;y1=t2;
            x2=t3;y2=t4;
            step=0;
        }
    };
    int bfs(){
        queue<node>que;
        node tmp=node(1,1,n,m),cur;
        vis[1][1][n][m]=true;
        que.push(tmp);
        while(!que.empty()){
            cur=que.front();que.pop();
            if(cur.x1==n&&cur.y1==m&&cur.x2==1&&cur.y2==1) return cur.step;
            REP(i,0,1){
                tmp.x1=cur.x1+next1[i][0];
                tmp.y1=cur.y1+next1[i][1];
                tmp.x2=cur.x2+next2[i][0];
                tmp.y2=cur.y2+next2[i][1];
                if(tmp.x1==tmp.x2&&tmp.y1==tmp.y2) continue;
                if(tmp.x1==cur.x2&&tmp.y1==cur.y2) continue;
                if(tmp.x1<1||tmp.x1>n||tmp.y1<1||tmp.y1>m) tmp.x1=cur.x1,tmp.y1=cur.y1;
                if(tmp.x2<1||tmp.x2>n||tmp.y2<1||tmp.y2>m) tmp.x2=cur.x2,tmp.y2=cur.y2;
                if(map[tmp.x1][tmp.y1]=='1') tmp.x1=cur.x1,tmp.y1=cur.y1;
                if(map[tmp.x2][tmp.y2]=='1') tmp.x2=cur.x2,tmp.y2=cur.y2;
                if(vis[tmp.x1][tmp.y1][tmp.x2][tmp.y2]) continue;
                vis[tmp.x1][tmp.y1][tmp.x2][tmp.y2]=true;
                tmp.step=cur.step+1;
                que.push(tmp);
            }
        }
        return -1;
    }
    int main()
    {
        n=read();m=read();
        REP(i,1,n) scanf("%s",map[i]+1);
        printf("%d
    ",bfs());
        return 0;
    }
    
  • 相关阅读:
    邮件发送
    生成缩略图
    截取字符串,中文安两个字符处理
    获取客户机MAC地址 根据IP地址 获取机器的MAC地址 / 获取真实Ip地址
    文件操作
    MD5加密 和 自定义加密解密
    Html标签替换(过滤掉html特殊符号)
    .net core 自定义中间件
    querySelector和querySelectorAll
    CSS下背景属性background的使用方法
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/7553222.html
Copyright © 2011-2022 走看看