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 ...
随机推荐
- 小工具:生成半透明背景色的 CSS 代码,不影响子元素透明度
工具:http://leegorous.net/tools/bg-alpha.html 工具介绍:http://leegorous.net/blog/2010/07/29/generate-css-c ...
- css 浮动说明
clear:both; 1.要了解的:什么是浮动.浮在某面板之上. 例如:float:left; 向左停靠, 就是让需要设置浮动的元素,跟在指定元素后面. 先上实例: 比较常用导航: .nav_ul ...
- Win7装在其他盘 (非C盘)办法
Win7装在其他盘 (非C盘)办法 1]将GHO还原到其他盘(非C盘),如H盘 2]用进U盘系统,里的工具,恢复启动H盘 3]将H盘的Boot文件夹,及其他根目录的所有文件复制到C盘根目录,重启即可开 ...
- WIN10远程连接winserver2012 r2,连接失败
背景:2012开启远程的时候,默认是勾选“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”,这个选项据说比较安全,但是用win10远程的时候就报错,函数不受支持,最后通过修改win10的配置得以 ...
- spark启动原理总结
一般情况下,我们启动spark集群都是start-all.sh或者是先启动master(start-master.sh),然后在启动slave节点(start-slaves.sh),其实翻看start ...
- 【Android】导航栏(加图片icon)和不同页面的实现(viewpager+tablayout)
先上图,然后说大致步骤,最后再说细节 图片效果:依序点击导航栏左一.左二.中.右二.右一,最后直接滑动页面(不依靠导航栏切换) 大致步骤如下(文末会有完整代码) [1]创建一个类,我这里取名TabBa ...
- 二、linux编译环境的搭建
1.linux编译工具安装 vim安装:apt-get install vim 注意:使用C语言源代码语法加亮功能,需要配置文件/etc/vim/vimrc,加入代码syntaxon.文件后缀必须为. ...
- jz_2440_电阻屏触摸驱动
驱动中: 入口函数init内: /* 1. 分配一个input_dev结构体 */ s3c_ts_dev = input_allocate_device(); /*------------------ ...
- VS2015 opencv 无法打开文件“opencv_calib3d330d.lib”
我用的opencv是3.3.0,vs是2015版,找到项目的属性管理器,链接器——>输入——>附加依赖项 把其他的东西都删掉,只添加 opencv_world330d.lib;%(Addi ...
- easyui设置行的背景色
var arr = new Array(3000082, 3000095); self.itemGrid.datagrid({ rowStyler: function (index, row) { f ...