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 ...
随机推荐
- Linux学习笔记——1.超级用户
以超级用户工作:su su命令允许临时变换到任何一用户标识(如果拥有口令的话),并挂起当前shell,为新用户开启一个新的shell. su <user> 将当前用户标识harley变换为 ...
- php.ini修改后,重启无效
今天做项目,上传图,需要修改php.ini.发现修改后,多次长期服务器也没用,在网上找了好多方案.介绍一下我的流程 1.使用phpinfo()找到php.ini的位置,如果位置不准确,修改肯定没有任何 ...
- PHP读取excel
$file = '';//文件名称 $file_ext = explode('.',$file);$file_ext = $file_ext[1];$data['file_ext'] = $file_ ...
- Python中常见的字典dict处理
#字典的赋值d = [{"dasda": 123, "gsgsg": 3344}, {"dasdz": 123, "gsksg&q ...
- Django模板语言与视图(view)
常用语法 {{ }}和{% %} 变量相关的用{{}} , 逻辑相关的用{% %} 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后 ...
- 指针小白:修改*p与p会对相应的地址的变量产生什么影响?各个变量指针的长度为多少?
这两天敲代码碰到了一个这样的问题 代码如下: #include <stdio.h> #include <stdlib.h> int main() { ; int* p=& ...
- vimrc 配置
" All system-wide defaults are set in $VIMRUNTIME/debian.vim and sourced by" the call to : ...
- 分布式专题(二)——Zookeeper的ZAB协议介绍
- 20145226夏艺华 《Java程序设计》第1周学习总结
http://www.cnblogs.com/bestixyh/p/5779286.html 去年暑假写的,确实比较丑陋,保留下来也是为了激励自己作出更多改变.寒假写的每一篇博客都尽最大努力养成了良好 ...
- 苏州Uber优步司机奖励政策(3月28日~3月30日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...