题目

  • 参考网址:https://vjudge.net/problem/UVA-1600
  • 大意:
    模拟机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n)。网格中的一些格子是空地,用0表示,其它格子是障碍,用1表示。机器人每次可以往四个方向走一格,但不能连续地穿越k( [0,20] )个障碍,求最短路长度。起点和终点保证是空地。

知识点

  • BFS

思路

和基本的BFS类似,最大的不同的是可以跨越障碍物。基本的BFS见该篇博客(骑士的移动(Knight Moves, Uva439)- BFS模板题)。只需要在判定的时候分情况讨论即可:

  • 若为障碍物,我们单独的进行判断:!_map[r + dr[dir] * (barrier)][c + dc[dir] * (barrier)],根据上下左右的情况看在跨越k个障碍物后的位置是否是空地,如果是空地直接将位置坐标更新到该点,否则不能往该方向移动。对于距离记录,我添加在了记录状态的结构体 - status中(因为有障碍物,方便直接“跳过障碍物”后距离的记录),将距离更新为r1 = r1 + dr[i] * (barrier) & c1 = c1 + dc[i] * (barrier),将该空地标记为“已访问”(障碍物无需标记,因为有不同方向,可能都可以跨过该障碍物),最后放入队列。
  • 若为空地,直接更新vis状态与距离后放入队列即可。

注意,在该题中,可能有无解的情况 - 四周障碍物围成一圈,且大于k个的跳跃范围,此时结果返回-1,说明“无解”。

代码

# include <iostream>
# include <cstdio>
# include <queue>
# include <vector>using namespace std;typedef struct status {int r, c, dis;status(int r1, int c1, int dis1) : r(r1), c(c1), dis(dis1) {}
};int dr[] = {-1, 1, 0, 0};  // 上下左右
int dc[] = {0, 0, -1, 1};
int _map[20][20];  // 地图
int vis[20][20];  // 是否遍历过,障碍不算
queue<status> q;  // 记录状态队列
vector <int> ans;bool is_notok(int m, int n, int r, int c){  // 判断是否超出边界return (r < 0 || r >= m || c < 0 || c >= n);
}bool is_barrier(int barrier, int dir, int r, int c) {  // 判断障碍是否可以穿过return !_map[r + dr[dir] * (barrier)][c + dc[dir] * (barrier)];
}bool is_visited(int r, int c){  // 判断是否访问过return vis[r][c];
}int bfs(int m, int n, int barrier) {  // 表明m行n列,也作为终点的位置status init(0, 0, 0);  // 左上角作为(0,0),初始点距离为0vis[0][0] = 1;q.push(init);while (!q.empty()) {status u = q.front();  q.pop();if (u.r == m - 1 && u.c == n - 1)  // 检查是否到达终点return u.dis;for (int i = 0; i < 4; i++) {// 更新下一步的位置int r1 = u.r + dr[i];int c1 = u.c + dc[i];if(is_notok(m, n, r1, c1))  // 超出边界continue;if(_map[r1][c1]){  // 是障碍if (is_barrier(barrier, i, r1, c1)) {  // 如果是障碍判断,通过i知道方向,可以决定是否穿过r1 = r1 + dr[i] * (barrier);  // 直接跨过障碍c1 = c1 + dc[i] * (barrier);vis[r1][c1] = 1;status v(r1, c1, u.dis + barrier + 1);q.push(v);}}else{  // 不是障碍if(!is_visited(r1, c1)){vis[r1][c1] = 1;status v(r1, c1, u.dis + 1);q.push(v);}}}}return -1;  // 无解
}int main() {int num;  // dataset的数量scanf("%d", &num);for (int i = 0; i < num; i++) {// 输入 & 初始化int m, n, barrier;  // 地图大小memset(_map, 0, sizeof(int[20][20]));memset(vis, 0, sizeof(int[20][20]));cin >> m >> n >> barrier;for (int m1 = 0; m1 < m; m1++) {for (int n1 = 0; n1 < n; n1++) {cin >> _map[m1][n1];}}// 广度优先遍历int test = bfs(m, n, barrier);ans.push_back(test);}for(int i:ans)cout << i << endl;return 0;
}

过程中遇到的问题 & 解决

  • 在判断障碍物部分,!_map[r + dr[dir] * (barrier)][c + dc[dir] * (barrier)],一开始多加了1,我们参数传的时候的坐标就是走到的障碍物的位置(v的坐标),而不是原先u的坐标。
  • 在更新越过障碍物后的位置也是上述问题,距离多加了1,导致步数有误。
  • 一开始判断障碍物方向用switch语句单独判断,写的有点复杂,我们可以利用上下左右的dr与dc:_map[r + dr[dir] * (barrier)][c + dc[dir] * (barrier)]

测试

输入:

3
2 5
0
0 1 0 0 0
0 0 0 1 0
4 6
1
0 1 1 0 0 0
0 0 1 0 1 1
0 1 1 1 1 0
0 1 1 1 0 0
2 2
0
0 1
1 0

结果:✔️

7
10
-1

巡逻机器人(Patrol Robot, Uva1600)相关推荐

  1. 习题6-5 UVA1600 巡逻机器人 Patrol Robot

    难度:4 稍微难一点的bfs,以前数组的bfs都是用二维,来记录这个点入过队没有,但是题目加了一个条件,那就是最多连续穿墙不超过一个数,那么这就又是一维状态,加一维来表示到这个点连续穿墙的次数,也就是 ...

  2. UVA1600 巡逻机器人 Patrol Robot

    首先这道题的意思就是,你走到没有障碍的地方,你连续穿越的障碍数就是0,走一个障碍+1,如果走到0那么连续障碍数归零,用一个结构体来保存状态,这时状态变成了三个,还有一个是走到这个点连续穿越的障碍数,通 ...

  3. 简单BFS 紫书 UVA 1600 巡逻机器人(Patrol Robot)

    题目链接: https://vjudge.net/problem/UVA-1600 思路 开了一个二维数组buf记录图的信息. Node中额外开了一片内存用来储存穿墙信息. 这道题一定要注意将点标记为 ...

  4. Patrol Robot UVa1600巡逻机器人

    题意大概: 机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n).网格中的一些格子是空地,用0表示,其它格子是障碍,用1表示.机器人每次可以往四个方向 ...

  5. 工业机器人 郝卫东_智能保安巡逻机器人论文

    第 1 页 共 5 页 智能保安巡逻机器人 黄海明 杨雷 宋跃 赖思沅 ( 东莞理工学院电子工程学院,广东 东莞 523808) 摘 要: 设计一个具有自动远程值守. GPRS 遥控. 远程监控等功能 ...

  6. 巡逻机器人(BFS)

    巡逻机器人问题(F - BFS,推荐) Description   A robot has to patrol around a rectangular area which is in a form ...

  7. 瓦力机器人故障维修_大眼萌!5G巡逻机器人亮相乌镇,24小时值守互联网大会...

    大大的眼睛,方方的身体, 一台酷似"瓦力"的机器人 出现在互联网之光新展馆. 原来这是嘉兴公安的"新同事"-5G巡逻机器人,今天是它第一天上岗.这也是本次世界互 ...

  8. 纸板箱机器人制作比例图纸_造一个黄油机器人(Butter Robot)

    上次制作了Rick的传送枪,这次我们来做个大一点的活,就是黄油机器人(Butter Robot)了. 我觉得一个Rick and Morty的粉丝兼一名Maker 一定会制作这一个剧中最受欢迎的机器人 ...

  9. 巡逻机器人用应用的pc端车牌识别

    PC端车牌识别产品形态 加密锁.车牌识别SDK开发包.开发文档 pc端车牌识别使用背景 人工智能的发展,京东送件也用上了送件机器人,某机器人公司如今研发出巡逻机器人,用于对可以车辆的抓拍与检查,在停车 ...

最新文章

  1. PNAS | 基因调控之深度学习揭示免疫细胞分化的调节机制
  2. css3整理--border-radius
  3. 10个开源免费的电子商务平台(转自伯乐在线)
  4. php正则匹配怎么写,正则表达式 - 求助怎么写php的正则匹配
  5. ./mysql-bin.index_MySQL 启动报错:File ./mysql-bin.index not found (Errcode: 13)
  6. python2添加pip,无法在python2.6中使用PIP更新/添加任何包
  7. sklearn中的xgboost_XGBoost的介绍、应用、调参、知识点
  8. 从零开始搭建物联网平台(三)数模设计
  9. 计算机自考毕业论文题目,自考男生发表数篇论文获专利 考取名校研究生
  10. python turtle setheading_Python turtle.right与turtle.setheading的区别
  11. uniapp使用picker
  12. 图像处理与机器视觉行业分析
  13. 为什么有时ping不通www baidu com但可以访问www baidu com网页
  14. 【涨知识】国内外点云处理著名研究团队
  15. 部分透明的遮罩层处理
  16. net开发过程中,错误集锦
  17. linux防误删工具trash-cli
  18. Farey sequences
  19. shineblink SYN6288语音输出
  20. EA的使用(用例图)

热门文章

  1. [EULAR文摘] 超声滑膜炎和腱鞘炎对已获临床缓解患者病情复发的预测
  2. 打印图像模糊问题解决方法
  3. 6.0.高等数学四-多元复合函数的偏导数
  4. Flash Builder常见菊紧问题集锦
  5. swagger在VS2019 .net core2.2中的使用,及报错undefined /swagger/v1/swagger.json的解决办法
  6. ROS机器人Diego 1#制作(十四)机械臂的控制---arduino驱动
  7. 学51单片机,总是感觉学不会该怎么办呢?
  8. 2022国产车排行榜前十名
  9. 一文搞懂MySQL体系架构!!
  10. 百度开源AI硬件开发平台BIE-AI-Box和BIE-AI-Board