难度:4

稍微难一点的bfs,以前数组的bfs都是用二维,来记录这个点入过队没有,但是题目加了一个条件,那就是最多连续穿墙不超过一个数,那么这就又是一维状态,加一维来表示到这个点连续穿墙的次数,也就是题目貌似加了障碍,但这个障碍是一会儿可走一会儿不可走的,不像别的题,要么可走要么不可走,这个一开始你穿过的障碍物少的时候,是可以走的,等穿的墙多了,就变得不可走了,所以就是可能几次走到了同一点,但是穿墙次数不一样,这时属于不同的情况,所以开一维数组来表示这不同的情况。

然后需要想明白的很重要的一个点是,当前点的k,也就是连续穿墙次数,如果当前点不是障碍物,那么归零,如果是障碍物,那么由前一个点的k加一,以前是判断两个值,也就是会不会出界,现在加上一个要判断的值,

#include <bits/stdc++.h>#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;struct node {int x, y, k;node() {}node(int a, int b, int c): x(a), y(b), k(c) {}
};int n, m, k;
int graph[30][30];
int vis[30][30][30];
int ans[30][30][30];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};bool judge(int x, int y, int kk) {if (x < 1 || x > n || y < 1 || y > m || kk > k) return false;return true;
}int bfs() {memset(vis, 0, sizeof(vis));queue<node> q;q.push(node(1, 1, 0));vis[1][1][0] = 1;ans[1][1][0] = 0;while(!q.empty()) {node now = q.front();q.pop();if (now.x == n && now.y == m) return ans[now.x][now.y][now.k];for (int i = 0; i < 4; i++) {int xx = now.x + dx[i];int yy = now.y + dy[i];int kk;if (graph[xx][yy]) kk = now.k + 1;else kk = 0;if (judge(xx, yy, kk) && !vis[xx][yy][kk]) {q.push(node(xx, yy, kk));vis[xx][yy][kk] = 1;ans[xx][yy][kk] = ans[now.x][now.y][now.k] + 1;}}}return -1;
}int main() {int t;cin >> t;while (t--) {cin >> n >> m >> k;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> graph[i][j];}}cout << bfs() << endl;}return 0;
}

习题6-5 UVA1600 巡逻机器人 Patrol Robot相关推荐

  1. UVA1600 巡逻机器人 Patrol Robot

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

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

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

  3. Patrol Robot UVa1600巡逻机器人

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

  4. Uva1600 巡逻机器人

    题目描述: 机器人从一个\(m\times n\)网格的左上角\((1,1)\)走到右下角\((m,n)\).网格中的一些格子是空地,用\(0\)表示,其他格子是障碍,用\(1\)表示.机器人每次可以 ...

  5. uva-1600 巡逻机器人

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

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

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

  7. 巡逻机器人(BFS)

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

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

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

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

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

最新文章

  1. Zenoss Announces Monitoring for VMWare's Cloud Director
  2. python怎么删除特定文件_如何使用python从文件中删除特定行?
  3. 电脑如何进入bios模式_电脑如何进入bios关闭软驱
  4. java位宽_Java的数据类型
  5. java package 路径_java文件路径问题及Eclipse package,source folder,folder区别及相互转换...
  6. MySQL数据库中,将一个字段的值分割成多条数据显示
  7. Android开发框架整理
  8. deepin linux Qt无法输入中文
  9. xshell7,xftp7个人免费版官方下载,无需破解,免激活,下载即可使用
  10. 【JavaSE基础】09-网络编程
  11. ISO 9000 族标准的构成
  12. 宁波中小学生计算机技术展示,宁波市第25届中小学生计算机程序设计竞赛复赛试题(小学组).doc...
  13. ZOOMIT的使用方法
  14. matlab实现基于DPCA密度峰值算法的图像分割
  15. AriaNG保存服务器信息,AriaNg
  16. 二阶常系数齐次线性微分方程通解的求取
  17. 域名防洪跳转html单页,域名防红跳转
  18. DevOps方法论掌握这四点,实践出真知
  19. centos 7安装podman(类似docker)
  20. 记一道MISC图片题(拖延癌晚期)

热门文章

  1. 局域网下访问自己的项目和网页
  2. jedis 源码阅读二——jedisPool
  3. PHP 抓取接口和网页(爬取方式)
  4. [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
  5. win10桌面右键卡顿卡死解决方法
  6. 真正补肾黑芝麻秘传做法
  7. 养老e周刊创始人孙黎:16000字讲解「互联网+养老」需要面对的难题
  8. 个人理财小助手 —— 数据库(二)
  9. 解读:电子合同四大理解误区
  10. 信息学奥赛一本通2063