Uva 1600 Patrol Robot (BFS 最短路)
这道题运用的知识点是求最短路的算法。一种方法是利用BFS来求最短路。
需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组。因为相同的坐标可以通过不同的穿墙方式到达。
#include <bits/stdc++.h>
using namespace std;
struct Node{
int r;
int c;
int g;
int cnt;
Node(int r,int c,int g,int cnt):r(r),c(c),g(g),cnt(cnt){}
};
int visit[][][];
int maps[][];
int m,n,k;
int ans;
const int dr[]={,-,,};
const int dc[]={,,,-};
int bfs(){
queue<Node> q;
q.push(Node(,,,));
visit[][][] = ;
while(!q.empty()){
Node u = q.front();
q.pop();
int r = u.r;
int c = u.c;
int cnt1 = u.cnt;
if(r == n && c == m)
return cnt1;
for(int i = ; i < ; i++){
int gg = u.g;
int r0 = r + dr[i];
int c0 = c + dc[i];
if(r0 < || c0 < || r0 > n || c0 > m) continue;
if(maps[r0][c0]) gg++;
else gg = ;
if(gg > k || visit[r0][c0][gg])continue;
visit[r0][c0][gg] = ;
q.push(Node(r0,c0,gg,cnt1+));
}
}
return -;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(visit,,sizeof(visit));
scanf("%d%d%d",&n,&m,&k);
for(int i = ; i <= n ; i++)
for(int j = ; j <= m ; j ++)
scanf("%d",&maps[i][j]);
printf("%d\n",bfs());
}
return ;
}
再一个方法可以用DFS求解。普通的DFS一定会超时。
State[r0][c0][gg] = ;
dfs(r0,c0,gg,cnt+);
State[r0][c0][gg] = ;
我们把原来的DFS进行一些修改:只有当前节点没有访问或者需要更新值时进行递归。
#include <bits/stdc++.h>
using namespace std;
struct Node{
int r;
int c;
int g;
int cnt;
Node(int r,int c,int g,int cnt):r(r),c(c),g(g),cnt(cnt){}
};
int State[][][];
int maps[][];
int m,n,k;
int ans;
const int dr[]={,-,,};
const int dc[]={,,,-};
void dfs(int r,int c,int g,int cnt){
if(r == n && c == m)
ans = min(ans,cnt); for(int i = ; i < ; i++){
int r0 = r + dr[i];
int c0 = c + dc[i];
int gg = g;
if(r0 < || c0 < || r0 > n || c0 > m) continue;
if(maps[r0][c0]) gg++;
else gg = ;
if(gg > k)continue;
if((State[r0][c0][gg] < || State[r0][c0][gg] > cnt + ) && gg <= k ){
State[r0][c0][gg] = cnt + ;
dfs(r0,c0,gg,cnt+);
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(State,-,sizeof(State));
ans = << ;
scanf("%d%d%d",&n,&m,&k);
for(int i = ; i <= n ; i++)
for(int j = ; j <= m ; j ++)
scanf("%d",&maps[i][j]);
dfs(,,,);
if(ans != << )printf("%d\n",ans);
else printf("-1\n");
}
return ;
}
Uva 1600 Patrol Robot (BFS 最短路)的更多相关文章
- UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)
题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...
- UVa 1600 Patrol Robot(BFS)
题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...
- UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)
UVA 1600 Patrol Robot Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- UVa 1600 Patrol Robot【BFS】
题意:给出一个n*m的矩阵,1代表墙,0代表空地,不能连续k次穿过墙,求从起点到达终点的最短路的长度 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0, ...
- UVA - 1600 Patrol Robot (巡逻机器人)(bfs)
题意:从(1,1)走到(m,n),最多能连续穿越k个障碍,求最短路. 分析:obstacle队列记录当前点所穿越的障碍数,如果小于k可继续穿越障碍,否则不能,bfs即可. #pragma commen ...
- UVa 1600 Patrol Robot (习题 6-5)
传送门: https://uva.onlinejudge.org/external/16/1600.pdf 多状态广搜 网上题解: 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰 ...
- UVa 1600 Patrol Robot(三维广搜)
A robot has to patrol around a rectangular area which is in a form of m x n grid (m rows and ncolumn ...
- UVA 1600 Patrol Robot
带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: #include <iostream> #include & ...
- 【UVa】1600 Patrol Robot(dfs)
题目 题目 分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T 代码 #include <cstdio> #include <cstring> #inc ...
随机推荐
- 前端的字符串时间如何自动转换为后端Java的Date属性,介绍springMVC中如何解决时间转换问题
平常在开发过程中,前端选择时间一般都要使用时间选择插件,但是这种插件选出来的时间都是字符串类型,我们该怎么转换为后端的Date呢?/? 前端效果如下(笔者用的是layDate5.0插件): 修改前的后 ...
- Spring MVC体系
框架搭建 web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...
- PHP中使用foreach时加&符号的用法
foreach时加&符号:遍历的同时改变原数组即修改数据或者增加数据. $arr = ['a', 'b', 'c']; foreach ($arr as $key => &$va ...
- thinkphp5 部署到iis服务器url重写
thinkphp部署到iis服务器配置url重写的解决方法: 1.下载 url rewrite.下载地址:https://www.iis.net/downloads/microsoft/url-rew ...
- Hive(9)-自定义函数
一. 自定义函数分类 当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数. 根据用户自定义函数类别分为以下三种: 1. UDF(User-Defined-Functi ...
- 报错: Name node is in safe mode
将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode 这是因为在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统 ...
- rails应用中各数据平台的对接
1.mongo #Gemfile添加如下两个gem包gem 'mongoid', '~> 5.1.0' gem 'mongo', '~> 2.4’ @client = Mongo::Cli ...
- python教程(二)·变量
什么是变量?在百度百科中,变量的解释是: 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念.变量可以通过-- 这是一段很长很长的解释,其实,作者认为没必要这么机械式的去理解.简单说,变量 ...
- st link 连接问题ST LINK is not in the DFU mode plesse restart it
原因:插上st link后做了一些操作才点击升级.如点击了连接stlink,如下图等: 解决办法: 1. 拔掉stlink 2. 插上stlink 3. 不要点其他的,直接点击ST-LINK-> ...
- 选择排序,C语言实现
选择排序是不稳定排序,时间复杂度为O(n^2). 选择排序类似插入排序,把数组分为两部分,一部分已经排好序,一部分未排序. 刚开始的时候所有的元素都未排序,已排序的部分为空.就好像你手里有十张牌,左手 ...