这道题运用的知识点是求最短路的算法。一种方法是利用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 最短路)的更多相关文章

  1. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  2. UVa 1600 Patrol Robot(BFS)

    题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...

  3. UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

    UVA 1600 Patrol Robot   Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   ...

  4. UVa 1600 Patrol Robot【BFS】

    题意:给出一个n*m的矩阵,1代表墙,0代表空地,不能连续k次穿过墙,求从起点到达终点的最短路的长度 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0, ...

  5. UVA - 1600 Patrol Robot (巡逻机器人)(bfs)

    题意:从(1,1)走到(m,n),最多能连续穿越k个障碍,求最短路. 分析:obstacle队列记录当前点所穿越的障碍数,如果小于k可继续穿越障碍,否则不能,bfs即可. #pragma commen ...

  6. UVa 1600 Patrol Robot (习题 6-5)

    传送门: https://uva.onlinejudge.org/external/16/1600.pdf 多状态广搜 网上题解: 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰 ...

  7. 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 ...

  8. UVA 1600 Patrol Robot

    带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: #include <iostream> #include & ...

  9. 【UVa】1600 Patrol Robot(dfs)

    题目 题目     分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T     代码 #include <cstdio> #include <cstring> #inc ...

随机推荐

  1. 纯js轮播图练习-2,js+css旋转木马层叠轮播

    基于css3的新属性,加上js的操作,让现在js轮播图花样越来越多. 而现在出现的旋转木马层叠轮播的轮播图样式,却是得到了很多人都喜爱和投入使用. 尤其是在各大软件中,频繁的出现在大家的眼里,在web ...

  2. Spring security学习笔记(二)

    对比两种承载认证信息的方式: session vs token token验证方案: session验证方案: session即会话是将用户信息保存在服务端,根据请求携带的session_id,从服务 ...

  3. Asp.Net Core使用Log4Net优化日志【项目开源】

    我在前一篇文章中介绍了一种使用Log4Net的方法,但是那种方法打出来的日志不是很直观 然后我前不久阅读了一篇非常不错的博客:https://www.cnblogs.com/guolianyu/p/9 ...

  4. Python学习手册之 Python 之禅、Python 编程规范和函数参数

    在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...

  5. flask(列表数据接口设计)

    新闻列表数据只是当前页面的一部分 点击分类时需要去获取当前分类下的新闻数据 并在展示的时候需要更新新闻列表界面,不需要整体页面刷新 所以新闻数据也使用 ajax 的方式去请求后台接口进行获取 接口设计 ...

  6. 使用boost.asio实现网络通讯

    #include <boost/asio.hpp> #define USING_SSL //是否加密 #ifdef USING_SSL #include <boost/asio/ss ...

  7. Netty示例

    一,服务端 ** * 测试Netty类库:服务端代码 * Created by LiuHuiChao on 2016/10/24. */ public class NettyServerTest { ...

  8. LeetCode: 59. Spiral Matrix II(Medium)

    1. 原题链接 https://leetcode.com/problems/spiral-matrix-ii/description/ 2. 题目要求 给定一个正整数n,求出从1到n平方的螺旋矩阵.例 ...

  9. JavaWeb项目生成PDF文件添加水印图片并导出

    一.前言 首先需要在Maven中添加相应的jar包依赖,若项目没用到Maven,也可自行下载相应所需的jar包(itextpdf.jar 与 itext-asian.jar),如下图所示.点此下载 M ...

  10. 阿里云中linux 下svn服务器安装

    摘要: 安装步骤如下: 1.yum install subversion 2.输入rpm -ql subversion查看安装位置,如下图:   我们知道svn在bin目录下生成了几个二进制文件. 输 ...