[Offer收割]编程练习赛27:题目2 : 两个机器人
来源:互联网 发布:urllib.request json 编辑:程序博客网 时间:2024/05/22 06:45
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
5 5 00001 00000 00100 01000 00000
- 样例输出
9
描述
一个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。
#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;}
阅读全文
1 0
- [Offer收割]编程练习赛27:题目2 : 两个机器人
- hihoCoder[Offer收割]编程练习赛2题目解析
- [offer收割]编程练习赛3-题目2:机会渺茫
- [Offer收割]编程练习赛27
- [Offer收割]编程练习赛2 hihocoder 1275 扫地机器人 (计算几何+模拟 比较烦)
- hihoCoder[Offer收割]编程练习赛3题目解析
- hihoCoder[Offer收割]编程练习赛1题目解析
- [Offer收割]编程练习赛2 hihocoder 1273 (DFS + 状压)
- [Offer收割]编程练习赛1
- hiho[Offer收割]编程练习赛1
- 2016 [Offer收割]编程练习赛3
- [Offer收割] 编程练习赛3
- [Offer收割]编程练习赛4
- [Offer收割]编程练习赛4
- [Offer收割]编程练习赛7
- [Offer收割]编程练习赛4
- [Offer收割]编程练习赛8
- [Offer收割]编程练习赛3
- P标签为什么不能嵌套块级标签
- Qt—学习之我的计算器
- java并发编程day07
- Python爬虫学习笔记Day2
- kafka随笔记
- [Offer收割]编程练习赛27:题目2 : 两个机器人
- Http协议之Get和Post的区别
- 09-javascript 函数定义和调用
- Hive之 hive与hadoop的联系
- Mysql B+树学习
- Faster-RCNN_TF代码解读10:proposal_layer_tf.py
- 浅淡茶知识
- Robot Framework+Appium案例分享三: WiFi测试
- WebService之RPC的(Axis2、CXF、Jersey、Hessian)4中实现方式