Problem UVA1600-Patrol Robot

Accept:529  Submit:4330

Time Limit: 3000 mSec

Problem Description

A robot has to patrol around a rectangular area which is in a form of m × n 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 (1 ≤ m,n ≤ 20). The second line contains an integer number k (0 ≤ k ≤ 20). The i-th 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 Ouput

7

10

-1

题解:自己做的第一道可以穿过障碍物的搜索,原来做的都相当于k==0的情况,这个题里多了一个可以穿越障碍物,但不能连续穿越多个的限制,这时再用一般的套路是会出错的。做过八数码的同学应该有感觉,BFS搜索中,判重是一件至关重要的事情,它可以避免大量无谓的搜索以及神奇的死循环。这里如果把判重数组定义成二维vis,就只能判断是否到过这里,而忽略了还能穿越几个障碍物这一参数。很有可能从两条路过来,长度相同但是其中一条还可以穿越更多的障碍,还有可能虽然暂时性的其中一条路到这里的时间戳较早,但是它能够继续穿越的障碍物也较少,对最终结果来说不如一条时间戳稍晚,但是还能穿越很多障碍物的路线,这些情况会被二维vis提前堵死,是很不可取的。解决方案就是vis数组加一维表示穿越了几个障碍物到达这里,这样再去判重就没问题了。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std; struct Point{
int x,y,time;
int layer;
Point(int x = ,int y = ,int time = ,int layer = ) :
x(x),y(y),time(time),layer(layer) {}
}; const int maxn = ;
int gra[maxn][maxn];
int vis[maxn][maxn][maxn];
int n,m,k;
int dx[] = {,-,,};
int dy[] = {,,-,}; int bfs(){
queue<Point> que;
que.push(Point(,,,));
memset(vis,,sizeof(vis));
vis[][][] = ;
while(!que.empty()){
Point first = que.front();que.pop();
if(first.x==n && first.y==m) return first.time;
int xx,yy;
for(int i = ;i < ;i++){
xx = first.x+dx[i],yy = first.y+dy[i];
if(<=xx && <=yy && xx<=n && yy<=m){
int layer = first.layer;
if(gra[xx][yy]) layer++;
else layer = ;
if(layer<=k && !vis[xx][yy][layer]){
vis[xx][yy][layer] = ;
que.push(Point(xx,yy,first.time+,layer));
}
}
}
}
return -;
} int main()
{
//freopen("input.txt","r",stdin);
int iCase;
scanf("%d",&iCase);
while(iCase--){
scanf("%d%d",&n,&m);
scanf("%d",&k);
for(int i = ;i <= n;i++){
for(int j = ;j <= m;j++){
scanf("%d",&gra[i][j]);
}
}
printf("%d\n",bfs());
}
return ;
}

UVA1600-Patrol Robot(BFS进阶)的更多相关文章

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

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

  2. UVA1600 Patrol Robot

    题意: 求机器人走最短路线,而且可以穿越障碍.N代表有N行,M代表最多能一次跨过多少个障碍. 分析: bfs()搜索,把访问状态数组改成了3维的,加了个维是当前能跨过的障碍数. 代码: #includ ...

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

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

  4. UVa 1600 Patrol Robot(BFS)

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

  5. UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

    UVA 1600 Patrol Robot   Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   ...

  6. UVa 1600 Patrol Robot【BFS】

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

  7. 【习题 6-5 UVA-1600】Patrol Robot

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 设dis[x][y][z]表示到(x,y)连续走了z个墙的最短路 bfs一下就ok [代码] /* 1.Shoud it use l ...

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

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

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

随机推荐

  1. python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  2. [SCOI2015] 情报传递

    题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有 n 名情报员.每名情报员可能有若干名 (可能没有) 下线,除 1 名大头目外其余 n−1 名情报员有且仅有 1 名上线.奈 ...

  3. Keepalived原理与实战精讲

    什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用 ...

  4. C++多重继承的构造执行顺序

    一个类,它可能有基类,也可能存在多个基类,这些类里面还可能是虚拟基类,并且在类的本身也可能存在对象成员.那么所涉及的这些类或对象成员会以什么样的顺序来调用它们各自的构造函数呢?今天我们就来举例分析下. ...

  5. 【手记】解决excel无法设置单元格颜色且界面怪异+桌面图标文字老有色块等问题

    注:问题是在XP上遇到的,不知道是否适用其它系统 问题现象 excel 2010成这样了: 关键是设置不了单元格颜色,无论是文字颜色还是背景色都设置不了,设了没变化.同时会发现桌面图标的文字总有底色: ...

  6. 浮动布局float

    浮动 浮动是css里面布局用的最多的属性. .box1{                      float: left;                      width: 300px;    ...

  7. npm 全局执行 update 、 outdated 出现 npm-debug.log 404 错误的问题

    想要执行一次全局更新,发现屡次报错: # npm update -g 提示的错误信息包含如下内容: npm ERR! code E404 npm ERR! 404 Registry returned ...

  8. CSS3圆圈动画放大缩小循环动画效果

    代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  9. Chrome调试本地文件无法使用window.opener对象进行窗口间值传递

    今天在百度BAE上建了个应用,svn上传后发现页面间互调有些问题,几经查询发现: (1)IE下正常的window.opener.object1.object2页面间对象访问方法在Chrome下不能使用 ...

  10. (其他)SQL注入(转)

    转自维基百科: SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序,在这种应用程序中,恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者).[1] SQL注入必须利用应用程序软件 ...