UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
Description
A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m. The columns are labeled from 1 to n. A cell (i, j) denotes the cell in row i and column j in the grid. At each step, the robot can only move from one cell to an adjacent cell, i.e. from (x, y) to (x + 1, y), (x, y + 1), (x - 1, y) or (x, y - 1). Some of the cells in the grid contain obstacles. In order to move to a cell containing obstacle, the robot has to switch to turbo mode. Therefore, the robot cannot move continuously to more than k cells containing obstacles.
Your task is to write a program to find the shortest path (with the minimum number of cells) from cell (1, 1) to cell (m, n). It is assumed that both these cells do not contain obstacles.
Input
The input consists of several data sets. The first line of the input file contains the number of data sets which is a positive integer and is not bigger than 20. The following lines describe the data sets.
For each data set, the first line contains two positive integer numbers m and n separated by space (1m, n
20). The second line contains an integer number k(0
k
20). The ith line of the next m lines contains n integer aij separated by space (i = 1, 2,..., m;j = 1, 2,...,n). The value of aij is 1 if there is an obstacle on the cell (i, j), and is 0 otherwise.
Output
For each data set, if there exists a way for the robot to reach the cell (m, n), write in one line the integer number s, which is the number of moves the robot has to make; -1 otherwise.
Sample Input
3
2 5
0
0 1 0 0 0
0 0 0 1 0
4 6
1
0 1 1 0 0 0
0 0 1 0 1 1
0 1 1 1 1 0
0 1 1 1 0 0
2 2
0
0 1
1 0
Sample Output
7
10
-1 题解:求机器人走最短路线,而且可以穿越障碍。
一道典型的BFS遍历的题,用队列实现,找到满足条件的最短路线;
题意很好理解,实现时应该注意判断规定障碍个数和标记走过的点。
BFS比DFS要快很多,一个用队列实现,一个用递归实现,都可以用
BFS的AC代码
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=;
int n,m,k;
int a[maxn][maxn][maxn];
int b[maxn][maxn];
int dir[][]= {-,,,,,-,,};
struct node
{
int x,y,step,zhangai;
void boom(int nx,int ny,int nstep,int nzhangai)
{
x=nx;
y=ny;
step=nstep;
zhangai=nzhangai;
}
}; int bfs()
{
queue<node>q;
while(!q.empty())
q.pop();
node u,v;
u.boom(,,,); //起点
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=; i<; i++)
{
int xx=u.x;
int yy=u.y;
int sstep=u.step;
int szhangai=u.zhangai;
xx+=dir[i][];
yy+=dir[i][];
sstep+=;
if(xx>n||xx<||yy>m||yy<)
continue;
if(b[xx][yy]==)
szhangai++;
else
szhangai=;
if(szhangai>k)
continue;
if(a[xx][yy][szhangai]==) //如果没有这一步会超时
continue;
if(xx==n&&yy==m)
return sstep;
v.boom(xx,yy,sstep,szhangai);
q.push(v);
a[xx][yy][szhangai]=;
}
}
return -;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&n,&m,&k);
memset(a,,sizeof(a)); //每次都要
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
scanf("%d",&b[i][j]);
int total=bfs();
printf("%d\n",total);
}
return ;
}
下面的是在网上看的一个用dfs实现的,也很容易懂
#include<iostream>
#include<cstring>
using namespace std;
int n,m,k;
int b[][];
int a[][][];
int total;
int xx[]= {-,,,};
int yy[]= {,,,-}; void dfs(int x,int y,int step,int zhangai)
{
if(x == n - && y == m - )
{
total = min(total,step);
return ;
}
for(int i = ; i < ; i++)
{
int nx = x + xx[i];
int ny = y + yy[i];
int st = zhangai;
if(b[nx][ny] == ) st++;
else
st = ;
if(nx >= && nx < n && ny >= && ny < m)
{
if((a[nx][ny][st] < || a[nx][ny][st] > step + ) && st <= k)
{
a[nx][ny][st] = step + ;
dfs(nx,ny,step + ,st);
}
}
}
return ;
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(a,-,sizeof(a));
total = <<;
cin>>n>>m>>k;
for(int i = ; i < n ; i++)
for(int j = ; j < m ; j ++)
cin>>b[i][j];
dfs(,,,);
if(total != << )
cout<<total<<endl;
else
cout<<"-1"<<endl;
}
return ;
}
UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)的更多相关文章
- UVA - 1600 Patrol Robot (巡逻机器人)(bfs)
题意:从(1,1)走到(m,n),最多能连续穿越k个障碍,求最短路. 分析:obstacle队列记录当前点所穿越的障碍数,如果小于k可继续穿越障碍,否则不能,bfs即可. #pragma commen ...
- 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最短路 && 略不一样的vis标记)
题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...
- UVa 1600 Patrol Robot (习题 6-5)
传送门: https://uva.onlinejudge.org/external/16/1600.pdf 多状态广搜 网上题解: 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰 ...
- UVa 1600 Patrol Robot(BFS)
题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...
- UVA 1600 Patrol Robot
带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: #include <iostream> #include & ...
- UVa 1600 Patrol Robot【BFS】
题意:给出一个n*m的矩阵,1代表墙,0代表空地,不能连续k次穿过墙,求从起点到达终点的最短路的长度 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0, ...
- Uva 1600 Patrol Robot (BFS 最短路)
这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...
- 【UVa】1600 Patrol Robot(dfs)
题目 题目 分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T 代码 #include <cstdio> #include <cstring> #inc ...
随机推荐
- DNA Sequence - POJ 2778(AC自动机+矩阵乘法)
题目大意:DNA序列是有 ATGC 组成的,现在知道一些动物的遗传片段有害的,那么如果给出这些有害的片段,能否求出来所有长度为 N 的基因中有多少是不包含这些有害片段的. 分析:也是断断续续做了一 ...
- Beautiful Numbers
http://codeforces.com/problemset/problem/300/C 题意:给你三个数a,b,n;求满足由a,b组成的n位的个数,且每个位置上的数之和也是用a,b组成; 解析: ...
- url传递中文的解决方案
本文转载:http://www.cnblogs.com/ghd258/archive/2005/10/23/260241.html url传递中文的解决方案 1.设置web.config文件. < ...
- 一个IT男的创业感言
2014年的一月 我和高中的一个同学開始人生的第一次创业.就写点第一次创业的经验吧! 创业的最初 须要心中大概有个规划 这个规划可能是非常粗糙的 但大的方向一定要有.详细就是你进入的行业 行业已经存在 ...
- 树莓派_Linux串口编程_实现自发自收
串口是计算机上一种很通用设备通信的协议,经常使用PC机上包括的是RS232规格的串口,具有连接线少,通讯简单,得到广泛的使用. Linux对全部设备的訪问是通过设备文件来进行的,串口也是这样,为了訪问 ...
- 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理
本节和<Android群英传>中的第3章Android控件架构与自定义控件详解有关系,建议先阅读该章的总结 第4章 View的工作原理 4.1 初始ViewRoot和DecorView ( ...
- 在Linux上怎么安装和配置Apache Samza
samza是一个分布式的流式数据处理框架(streaming processing),它是基于Kafka消息队列来实现类实时的流式数据处理的.(准确的说,samza是通过模块化的形式来使用kafka的 ...
- Python多线程锁
[Python之旅]第六篇(四):Python多线程锁 python lock 多线程 多线程使用方法 多线程锁 摘要: 在多线程程序执行过程中,为什么需要给一些线程加锁以及如何加锁,下面就来 ...
- Oracle数据表恢复
用于直接drop掉表的情况(plsql developer直接删掉表就是drop操作) 查删除的表select object_name,original_name,partition_name,typ ...
- 遍历aspx页面中所有的指定控件
//1.遍历页面中所有的TextBox,并将值设置成String.Empty for (int j = 0; j < this.Controls.Count; j++){ foreac ...