[Offer收割]编程练习赛27:题目2 : 两个机器人

来源:互联网 发布:urllib.request json 编辑:程序博客网 时间:2024/05/22 06:45

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

一个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。

样例输入
5 5  00001  00000  00100  01000  00000
样例输出
9
思路:bfs。用一个4维的数组判重,即v[sx][sy][ex][ey]。(sx,sy)表示第一个机器人的位置,(ex,ey)表示第二个机器人的位置。

#include<bits/stdc++.h>using namespace std;int n,m;char s[100][100];int v[51][51][51][51];int d[4][2]={-1,0,0,-1,1,0,0,1};void bfs(){    queue<int>p;    v[0][0][n-1][m-1]=1;    p.push(0);    p.push(0);    p.push(n-1);    p.push(m-1);    while(!p.empty())    {        int x1=p.front();p.pop();        int y1=p.front();p.pop();        int x2=p.front();p.pop();        int y2=p.front();p.pop();        if(x1==n-1&&y1==m-1&&x2==0&&y2==0){printf("%d\n",v[x1][y1][x2][y2]-1);return;}        for(int i=0;i<4;i++)        {            int sx=x1+d[i][0];            int sy=y1+d[i][1];            int ex=x2-d[i][0];            int ey=y2-d[i][1];            if(sx==ex&&sy==ey)continue;                      //走到同一个位置            if(sx==x2&&sy==y2&&ex==x1&&ey==y1)continue;      //互换位置            if(sx<0||sx>=n||sy<0||sy>=m)sx=x1,sy=y1;         //超出边界            if(ex<0||ex>=n||ey<0||ey>=m)ex=x2,ey=y2;         //超出边界            if(s[sx][sy]=='1')sx=x1,sy=y1;          //遇到障碍            if(s[ex][ey]=='1')ex=x2,ey=y2;          //遇到障碍            if(v[sx][sy][ex][ey])continue;            v[sx][sy][ex][ey]=v[x1][y1][x2][y2]+1;            p.push(sx);            p.push(sy);            p.push(ex);            p.push(ey);        }    }    puts("-1");}int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)scanf("%s",s[i]);    memset(v,0,sizeof v);    bfs();    return 0;}





原创粉丝点击