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;
    }
    
  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/7553222.html
Copyright © 2011-2022 走看看