UVa 1600 Patrol Robot (习题 6-5)
传送门: https://uva.onlinejudge.org/external/16/1600.pdf
多状态广搜
网上题解: 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0,当前的k变成最初的k。
vis[x][y][z] x, y代表坐标 z表示k 当为真时说明该点剩余穿墙次数为k的状态已出现过
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef struct Node{ 5 int x, y, step, k; 6 } node; 7 const int MAXN = 25; 8 const int INF = 0x3f3f3f3f; 9 const int cx[] = {-1, 1, 0, 0}; 10 const int cy[] = {0, 0, -1, 1}; 11 int n, m, k, ans; 12 int maze[MAXN][MAXN]; 13 int vis[MAXN][MAXN][MAXN]; 14 15 void bfs(){ 16 queue<node> q; 17 while(!q.empty()) q.pop(); 18 node cur ; 19 cur.x = cur.y = 1; 20 cur.step = 0; 21 cur.k = k; 22 q.push(cur); 23 vis[cur.x][cur.y][cur.k] = 1; 24 while(!q.empty()){ 25 cur = q.front(); 26 q.pop(); 27 int x = cur.x, y = cur.y; 28 if(x == n && y == m){ 29 ans = cur.step; 30 return ; 31 } 32 node now; 33 if(cur.k >= 0){ 34 for(int i = 0; i < 4; ++i){ 35 now.x = x + cx[i], now.y = y + cy[i]; 36 now.step = cur.step + 1; 37 now.k = maze[now.x][now.y] ? cur.k - 1 : k; 38 if(now.x < 1 || n < now.x || now.y < 1 || m < now.y || vis[now.x][now.y][now.k]) continue; 39 if(now.k >= 0){ 40 vis[now.x][now.y][now.k] = 1; 41 q.push(now); 42 } 43 } 44 } 45 } 46 } 47 48 int main(){ 49 int t; 50 cin >> t; 51 while(t--){ 52 cin >> n >> m >> k; 53 memset(vis, 0, sizeof(vis)); 54 memset(maze, 0, sizeof(maze)); 55 for(int i = 1; i <= n; ++i) 56 for(int j = 1; j <= m; ++j) 57 cin >> maze[i][j]; 58 ans = -1; 59 bfs(); 60 cout << ans << endl; 61 } 62 return 0; 63 }
转载于:https://www.cnblogs.com/book-book/p/5343560.html
UVa 1600 Patrol Robot (习题 6-5)相关推荐
- UVA - 1600 Patrol Robot (巡逻机器人)(bfs)
题意:从(1,1)走到(m,n),最多能连续穿越k个障碍,求最短路. 分析:obstacle队列记录当前点所穿越的障碍数,如果小于k可继续穿越障碍,否则不能,bfs即可. #pragma commen ...
- UVA 1600 Patrol Robot 巡逻机器人(BFS)
需要注意的一点是:障碍物可以访问多次(因为当访问此障碍物时,当前路径穿过的连续障碍物次数大于或小于以前的路径也可以访问该点(也许以前的路径并不能走到终点)) #include<cstdio> ...
- 【UVa】1600 Patrol Robot(dfs)
题目 题目 分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T 代码 #include <cstdio> #include <cstring> #include < ...
- UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
非常适合A*的一道题. 比普通的迷宫问题加一个信息k表示当前穿过的障碍物的数量. #include<cstdio> #include<cstring> #include< ...
- UVa 1600 巡逻机器人(Patrol Robot)
机器人要从一个网格的左上角走到右下角,网格中的一些格子是空地,用0表示,障碍物用1表示,机器人每次可以往上下左右走1格,但不能连续的穿过k格障碍,求最短路的长度,起点终点保证是空地. 要点: 本题乍看 ...
- 简单BFS 紫书 UVA 1600 巡逻机器人(Patrol Robot)
题目链接: https://vjudge.net/problem/UVA-1600 思路 开了一个二维数组buf记录图的信息. Node中额外开了一片内存用来储存穿墙信息. 这道题一定要注意将点标记为 ...
- 习题6-5巡逻机器人 UVa 1600 bfs
题目:点击打开链接 分析:一道bfs题,由于到达一点需要判断经过了几个障碍,所以在vis数组中需要加上一维来表示经过的障碍物,因为到达一点的可行路径是不同的,如果单纯的用vis[x][y],来表示点的 ...
- 习题6-5 UVA1600 巡逻机器人 Patrol Robot
难度:4 稍微难一点的bfs,以前数组的bfs都是用二维,来记录这个点入过队没有,但是题目加了一个条件,那就是最多连续穿墙不超过一个数,那么这就又是一维状态,加一维来表示到这个点连续穿墙的次数,也就是 ...
- 习题6_5 巡逻机器人(Patrol Robot, ACM/ICPC Hanoi 2006, UVa1600)
越障可以拐弯,一个障碍可能被不同路线所经过,所以普通的dfs不行,再加一个维度step,表示走到此结点越过的障碍数 #include<cstdio> #include<cstring ...
最新文章
- 记一次简单的 JVM 调优经历
- [转]Python测试框架对比----unittest, pytest, nose, robot framework对比
- 腾讯:将收购Riot Games多数股权
- java封装的快捷_Fast-boot:针对SpringBoot 封装的一系列的快捷包
- Chrome OS 云里雾里
- java线程提交_从Java线程到线程池
- SpringGateway与Zookeeper的Maven冲突
- sql提取字符串中的一部分数据_学会这三招提取字符串中的数字不用愁
- PHP读写指定URL参数的方法
- refresh-刷新
- gnome3 修改桌面背景图片模式
- IT认证之架构师认证
- PASCAL Visual Object Classes Challenge 2007(VOC 2007)数据集预处理
- 成功解决TypeError: distplot() got an unexpected keyword argument ‘y‘
- python复合赋值语句语法_复合结构的赋值语句理解
- PTA创建视图,包含商品打折前后的价格信息
- LINUX rhcsa小练习题(创建文件/目录,移动/复制文件,重定向/追加重定向,创建别名)
- 用两个小样例来解释单例模式中的“双重锁定”
- 在vue项目中引入高德地图并使用
- 微信发支付宝红包(花呗)
热门文章
- 将物体固定在坐标某个点_坐标变换(2)—不同坐标系下的变换
- 拼多多砍价小程序源码 流量主系列
- 与梦城Typecho博客数据站+API站
- (一)KitJs瀑布流组件特点
- Asp.Net 4.0 SEO增强之UrlRouting
- 一个 WordPress 安装,多个博客
- 通过IHttpHandlerFactory,过滤TextBox、Input和Textarea中的特殊字符
- html5游戏制作入门系列教程(二)
- Linux流量监控工具 – iftop
- 深入理解Magento – 第一章 – Magento强大的配置系统