这道题运用的知识点是求最短路的算法。一种方法是利用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. RAC初体验(环境搭建)

      实施阶段: 1.主机配置 2.安装Clusterware 3.安装Oracle Database 4.配置Listener 5.创建ASM 6.创建Database 一.主机配置 1.网络设置 I ...

  2. 移动端网站通用模板 单位rem

    html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8& ...

  3. redis之闪电内幕

    一.简介和应用 二.Redis的对象redisObject 三.String 四.List 4.1 linkedlist(双端链表) 4.2 ziplist(压缩列表) 五.Hash 六.Set 七. ...

  4. ueditor 富文本编辑器 Uncaught TypeError: Cannot set property 'innerHTML' of undefined问题

    ueditor.addListener("ready", function () { ueditor.setContent(‘内容'); });

  5. laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案

    需求: 分组联合查询,或者最新记录. 问题:  mysql分组的时候默认会查询第一条记录,存在gourp by时 order by 无效. 一般解决办法就是 ,select * from ( sele ...

  6. centos install rabbitmq

    安装rabbitmq 需要环境上有erlang,没有安装的可以参照下面的内容进行安装: https://www.erlang-solutions.com/resources/download.html ...

  7. HTTP学习之URL与资源

    URL是因特网资源的标准化名称,该字符串指向一条电子信息片段,定义服务端应用程序在什么位置以及客户端要如何与其交互 一条完整的URL由多个片段组成. 通用URL组件 方案 以哪种协议访问服务器 用户 ...

  8. 指针小白:修改*p与p会对相应的地址的变量产生什么影响?各个变量指针的长度为多少?

    这两天敲代码碰到了一个这样的问题 代码如下: #include <stdio.h> #include <stdlib.h> int main() { ; int* p=& ...

  9. SpaceVim 语言模块 lua

    原文连接: https://spacevim.org/cn/layers/lang/lua/ 模块简介 启用模块 快捷键 交互式编程 运行当前脚本 模块简介 这一模块为在 SpaceVim 中进行 l ...

  10. 北京Uber优步司机奖励政策(2月26日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...