Uva1600 巡逻机器人
题目描述:
机器人从一个\(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 巡逻机器人相关推荐
- Patrol Robot UVa1600巡逻机器人
题意大概: 机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n).网格中的一些格子是空地,用0表示,其它格子是障碍,用1表示.机器人每次可以往四个方向 ...
- uva-1600 巡逻机器人
bfs判断visited最好还是在入栈之前,这道题的就算visited==true,但如果走过的'1'数量比较少的话,还是可以继续入栈的 #include <cstdio> #includ ...
- 习题6-5 UVA1600 巡逻机器人 Patrol Robot
难度:4 稍微难一点的bfs,以前数组的bfs都是用二维,来记录这个点入过队没有,但是题目加了一个条件,那就是最多连续穿墙不超过一个数,那么这就又是一维状态,加一维来表示到这个点连续穿墙的次数,也就是 ...
- UVA1600 巡逻机器人 Patrol Robot
首先这道题的意思就是,你走到没有障碍的地方,你连续穿越的障碍数就是0,走一个障碍+1,如果走到0那么连续障碍数归零,用一个结构体来保存状态,这时状态变成了三个,还有一个是走到这个点连续穿越的障碍数,通 ...
- 瓦力机器人故障维修_大眼萌!5G巡逻机器人亮相乌镇,24小时值守互联网大会...
大大的眼睛,方方的身体, 一台酷似"瓦力"的机器人 出现在互联网之光新展馆. 原来这是嘉兴公安的"新同事"-5G巡逻机器人,今天是它第一天上岗.这也是本次世界互 ...
- 巡逻机器人用应用的pc端车牌识别
PC端车牌识别产品形态 加密锁.车牌识别SDK开发包.开发文档 pc端车牌识别使用背景 人工智能的发展,京东送件也用上了送件机器人,某机器人公司如今研发出巡逻机器人,用于对可以车辆的抓拍与检查,在停车 ...
- 安防巡逻机器人在不同应用场景下的作用是什么?
目前,传统的安防行业正在加速人工智能在该领域的集成和应用.随着人工智能安防技术进一步加强,如今,很多城市都开始纷纷打造一座智慧型城市,安防机器人也普遍出现在各个行业当中,下面,国辰机器人就为大家来盘点 ...
- 工业机器人 郝卫东_智能保安巡逻机器人论文
第 1 页 共 5 页 智能保安巡逻机器人 黄海明 杨雷 宋跃 赖思沅 ( 东莞理工学院电子工程学院,广东 东莞 523808) 摘 要: 设计一个具有自动远程值守. GPRS 遥控. 远程监控等功能 ...
- 水下自动循迹机器人_一种夜间巡逻机器人自动循迹方法
一种夜间巡逻机器人自动循迹方法 [技术领域] [0001]本发明涉及机器人应用技术领域,尤其涉及一种夜间巡逻机器人自动循迹方法. [背景技术] [0002]目前,博物馆.会展中心以及公园等场所的夜间安 ...
最新文章
- applicationContext.xml 的位置问题
- AMG8833的使用与stm32驱动代码
- 数学之美 系列十一 - Google 阿卡 47 的制造者阿米特.辛格博士
- 【SHARE】WEB前端学习资料
- xmlhttprequest level 2
- python 网络编程----非阻塞或异步编程
- iOS开发ARC内存管理
- Linux 防火墙 开放 端口 iptables
- Mongodb语法学习:查询
- Linux运维工程师面试题库,Linux运维工程师面试题库
- LaTeX符号语法总结
- 用户粘性︱如何提升用户忠诚度
- 数学建模-SARS疫情对某些经济指标影响例题
- 软件测试的7个基本原则
- 坎坷道路-程序员必须先让自己的心灵强大起来
- [ Linux ] 格式化硬盘出现/dev/sdb is apparently in use by the system
- 检测到有潜在危险的 Request.Form 值
- 视 频 传 输 技 术
- 彻底分清机器学习中的上采样、下采样、过采样、欠采样【总结】
- 【阅读笔记】Falsification of Cyber-Physical Systems Using Deep Reinforcement Learning