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 (ij) 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 (xy) to (x + 1, y), (xy + 1), (x - 1, y) or (xy - 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 (mn). 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 (1mn20). The second line contains an integer number k(0k20). 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 (ij), and is 0 otherwise.

Output

For each data set, if there exists a way for the robot to reach the cell (mn), 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)的更多相关文章

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

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

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

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

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

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

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

  5. UVa 1600 Patrol Robot(BFS)

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

  6. UVA 1600 Patrol Robot

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

  7. UVa 1600 Patrol Robot【BFS】

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

  8. Uva 1600 Patrol Robot (BFS 最短路)

    这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...

  9. 【UVa】1600 Patrol Robot(dfs)

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

随机推荐

  1. varnish esi出现no esi processing, first char not ‘<’的错误处理方式

    大致意思是varnish的ESI使用mod_deflate来处理可以接受含有请求头Accept-Encoding的请求,这样转发到后端服务器后,后端服务器返回的响应内容就不是一个格式良好的XML或ht ...

  2. python 代码格式化工具:autopep8

    学习资料: https://github.com/hhatto/autopep8 背景 autopep8 会根据 PEP 8 样式文档来格式化 python 代码.它使用 pep8 来决定代码的哪部分 ...

  3. redis合库

    玩家数据全部保存在redis,对合服来绝对是个坑.因为一直都是做开发,合库这事还是第一次操作. 首先,合服要做哪些事情,当然不同的游戏肯定不一样.合服的目的是为了增加同个服务器上活跃玩家的数量.合服有 ...

  4. Finding Palindromes - 猥琐的字符串(Manacher+trie)

    题目大意:有 N 个字符串,所有的字符串长度不超过 200W 任意俩俩字符串可以自由组合,问组合的字符串是回文串的个数有多少个?   分析:这是一个相当猥琐的字符串处理,因为没有说单个的字符串最少多长 ...

  5. 英蓓特Mars board的android4.0.3源码编译过程

    英蓓特Mars board的android4.0.3源码编译过程 作者:StephenZhu(大桥++) 2013年8月22日 若要转载,请注明出处 一.编译环境搭建及要点: 1. 虚拟机软件virt ...

  6. 一步一步学android之事件篇——单击事件

    在使用软件的时候单击事件必不可少,比如我想确定.取消等都需要用户的单击,所有的单击事件都是由View.OnClickListener接口来进行处理的,接口定义如下: public static int ...

  7. oracle 零散知识汇集

    1. Select '登陆' + 2 From dual会报错: ora- 01722 无效数字,原理是oracle把'登陆'当成数字来和2进行加法运算. Select '登陆'|| 2 From d ...

  8. Android 图片选择器

    图片选择器,遍历系统所有图片并显示,点击查看大图,长按选中,并将结果返回 字体颜色res/color建立text_selecor.xml <selector xmlns:android=&quo ...

  9. sync fsync fdatasync ---systemtap跟踪

    aa.stp: probe kernel .function ( "sys_sync" ) { printf ( "probfunc:%s fun:%s\n", ...

  10. 一道在知乎很火的 Java 题——如何输出 ab【转】

    这是一个源自知乎的话题,原贴链接:一道百度的面试题,有大神会嘛? 虽然我不是大神,但我也点进去看了一下,思考了一会之后有了一些思路,然后去看其它人的答案的时候果然全都已经被各路大神们先想到并贴出来了, ...