题目描述:

机器人从一个\(m\times n\)网格的左上角\((1,1)\)走到右下角\((m,n)\)。网格中的一些格子是空地,用\(0\)表示,其他格子是障碍,用\(1\)表示。机器人每次可以往四个方向走一格,但不能连续地穿越\(k\)个障碍,求最短路的长度。起点和中点保证是空地。

思路:

还是BFS求最短路,但是因为不能连续穿过\(k\)个障碍,所以与普通BFS不同的是这里需要考虑到达某个格子时已经连续走了几个障碍,而且即使格子已经被访问过,但如果新的访问耗费的障碍数能小于此前访问耗费的障碍数,也是可以访问的(与普通BFS的区别在这里)。后面这点是我开始没有想到,后面对着udebug上的测试数据调的时候才发现问题的,还有就是要考虑一下\(m=1,n=1\)的初始条件。

代码:

#include <iostream>
#include <queue>
#include <utility>
#include <algorithm>
#include <memory.h>
using namespace std;
const int maxn = 20 + 2;
int b[maxn][maxn];
int d[maxn][maxn];
int obs[maxn][maxn];
int m, n, k;const int dr[] = { 0, -1, 0, 1};
const int dc[] = { 1, 0, -1, 0};pair<int, int> walk(pair<int, int> u, int i){pair<int, int> v;v.first = u.first + dr[i];v.second = u.second + dc[i];return v;
}void solve(){queue<pair<int, int> > q;q.push(make_pair(1, 1));memset(d, -1, sizeof(d));memset(obs, 0, sizeof(obs));d[1][1] = 0;while(!q.empty()){pair<int, int> u = q.front(); q.pop();for(int i = 0; i < 4; ++i){pair<int, int> v = walk(u, i);if(v.first == m && v.second == n) { //抵达终点d[v.first][v.second] = d[u.first][u.second] + 1;printf("%d\n", d[v.first][v.second]); return;}if(v.first > 0 && v.first <= m && v.second > 0 && v.second <= n && (d[v.first][v.second]<0||d[v.first][v.second]>0&&obs[u.first][u.second]+1<obs[v.first][v.second])){  //没有出界&&(没有被访问过||访问过但是当前路径到达这个点时耗费的障碍数更少)d[v.first][v.second] = d[u.first][u.second] + 1;//更新起点到达该网格的距离if(b[v.first][v.second] == 1){ //如果网格是一个障碍 obs[v.first][v.second] = obs[u.first][u.second] + 1;//获得当前网格连续经过的障碍数if(obs[v.first][v.second] > k) { d[v.first][v.second] = -1;  obs[v.first][v.second] = 0; continue;}//如果障碍数超过限制,将这个网格标记为没有访问,重新将其状态初始化。 }else obs[v.first][v.second] = 0; //不是网格就清零连续障碍数q.push(v);}}}if(d[m][n] < 0) printf("-1\n");//最终没能访问到终点,输出-1else printf("%d\n", d[m][n]); //这里是应对m=1,n=1的边界条件
}int main(){//freopen("uva1600_in.txt", "r", stdin);//freopen("uva1600_out.txt", "w", stdout);int T; scanf("%d", &T);while(T--){scanf("%d%d%d", &m, &n, &k);for(int i = 1; i <= m; ++i){for(int j = 1; j <= n; ++j)scanf("%d", &b[i][j]);}solve();}
}

转载于:https://www.cnblogs.com/patrolli/p/11299838.html

Uva1600 巡逻机器人相关推荐

  1. Patrol Robot UVa1600巡逻机器人

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

  2. uva-1600 巡逻机器人

    bfs判断visited最好还是在入栈之前,这道题的就算visited==true,但如果走过的'1'数量比较少的话,还是可以继续入栈的 #include <cstdio> #includ ...

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

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

  4. UVA1600 巡逻机器人 Patrol Robot

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

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

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

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

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

  7. 安防巡逻机器人在不同应用场景下的作用是什么?

    目前,传统的安防行业正在加速人工智能在该领域的集成和应用.随着人工智能安防技术进一步加强,如今,很多城市都开始纷纷打造一座智慧型城市,安防机器人也普遍出现在各个行业当中,下面,国辰机器人就为大家来盘点 ...

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

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

  9. 水下自动循迹机器人_一种夜间巡逻机器人自动循迹方法

    一种夜间巡逻机器人自动循迹方法 [技术领域] [0001]本发明涉及机器人应用技术领域,尤其涉及一种夜间巡逻机器人自动循迹方法. [背景技术] [0002]目前,博物馆.会展中心以及公园等场所的夜间安 ...

最新文章

  1. applicationContext.xml 的位置问题
  2. AMG8833的使用与stm32驱动代码
  3. 数学之美 系列十一 - Google 阿卡 47 的制造者阿米特.辛格博士
  4. 【SHARE】WEB前端学习资料
  5. xmlhttprequest level 2
  6. python 网络编程----非阻塞或异步编程
  7. iOS开发ARC内存管理
  8. Linux 防火墙 开放 端口 iptables
  9. Mongodb语法学习:查询
  10. Linux运维工程师面试题库,Linux运维工程师面试题库
  11. LaTeX符号语法总结
  12. 用户粘性︱如何提升用户忠诚度
  13. 数学建模-SARS疫情对某些经济指标影响例题
  14. 软件测试的7个基本原则
  15. 坎坷道路-程序员必须先让自己的心灵强大起来
  16. [ Linux ] 格式化硬盘出现/dev/sdb is apparently in use by the system
  17. 检测到有潜在危险的 Request.Form 值
  18. 视 频 传 输 技 术
  19. 彻底分清机器学习中的上采样、下采样、过采样、欠采样【总结】
  20. 【阅读笔记】Falsification of Cyber-Physical Systems Using Deep Reinforcement Learning

热门文章

  1. 微信小程序开发简易计算器改进版
  2. webpack 配置简单说几句 ?
  3. 传苹果产品总设计师欲离职 地位堪比乔布斯
  4. google的阴阳历转换查询
  5. 堆(heap)与栈(stack)的区别(二)
  6. Pycharm如何设置自定义背景颜色
  7. 用JTAG将mcs文件烧写到flash中
  8. C++递归与非递归实现链表的反转
  9. c语言坐标扫雷程序,用C语言写一个扫雷程序
  10. 如何用php向wsdl服务器发请求,知道服务器端Wsdl,不写服务端代码,仅写客户端代码能调用服务端的方法吗?...