非常适合A*的一道题。

比普通的迷宫问题加一个信息k表示当前穿过的障碍物的数量。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX = ; int m,n,k; int C[MAX][MAX][MAX];
int G[MAX][MAX]; int tarx,tary;
struct node
{
int g,h;
int x,y;//对于本题 x+y 越大距离终点越近
int k;
bool operator < (const node& rhs) const{
if(g + h > rhs.g + rhs.h) return true;
if(g + h < rhs.h + rhs.g ) return false;
if(g > rhs.g) return true;
if(g < rhs.g) return false;
return k > rhs.k;
}
void H(){
h = tarx - x+ tary - y;
}
}; node start; #define C(n) C[n.x][n.y][n.k]
#define add(n) C(n) = true
int dx[] = { , , ,-};
int dy[] = { , ,-, }; int bfs()
{
priority_queue<node> q;
memset(C,false,sizeof(C));
q.push(start); add(start);
node cur,nxt;
int i,nx,ny,nk;
while(q.size()){
cur = q.top();q.pop();
if(cur.x == tarx && cur.y == tary) return cur.g;
for(i = ; i < ; i++){
nx = cur.x + dx[i];
ny = cur.y + dy[i];
if(nx >= m || nx < || ny >= n || ny < )continue;
nk = G[nx][ny] ? cur.k+ : ;
if(C[nx][ny][nk] || nk > k) continue;
nxt.x = nx ; nxt.y = ny; nxt.g = cur.g+ ; nxt.k = nk ; nxt.H();
q.push(nxt); add(nxt);
}
}
return -;
} int main()
{
// freopen("in.txt","r",stdin);
int T;
int i,j;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&m,&n,&k);
for(i = ;i < m; i++)
for(j = ;j < n; j++)
scanf("%d",G[i]+j);
tarx = m-;tary = n-;
start.x = start.y = start.g = start.k = ;
//start.H();
printf("%d\n",bfs());
}
return ;
}

UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)的更多相关文章

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

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

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

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

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

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

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

  5. UVa 1600 Patrol Robot(BFS)

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

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

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

  7. UVA 1600 Patrol Robot

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

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

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

  9. UVa 1600 Patrol Robot【BFS】

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

随机推荐

  1. Socket()与WSASocket()的区别

    socket()   创建一个通讯端点并返回一个套接口.但是在socket库中例程在应用于阻塞套接口时会阻塞.     WSASocket()的发送操作和接收操作都可以被重叠使用.接收函数可以被多次调 ...

  2. 在Sql2005中,向表中插入数据时遇到uniqueidentifier列,如何插入数据?

    Sql2005中,提供了uniqueidentifier 数据类型.说白了,就是个GUID,这种类型开发时倒是很有必要的. 今天程序中遇到了这个问题:表里定义了一个uniqueidentifier 列 ...

  3. mysql给id生成uuid

    mysql中id一般都设为uuid,除了我们在后台用到的uuid利用jpa注解来生成外,其实在mysql中直接也可以生成 直接上代码: 1.mysql中直接使用uuid()函数,可以生成一个随机的uu ...

  4. JS中map list 数组的迭代

    后台传给前台一个map 前台如何迭代呢 $.post("getSys.jhtml", function(data){ var temp = ""; $.each ...

  5. 洛谷P3293 [SCOI2016]美味(主席树)

    传送门 据说这题做法叫做可持久化trie树?(然而我并不会) 首先考虑一下贪心,从高位到低位枚举,如果能选1肯定比选0优 假设已经处理到了$b$的第$i$位,为1(为0的话同理就不说了) 那么只有当$ ...

  6. php输出变量加{}的作用

    之前在输出字符串中有变量如 echo “中间有”; echo $i; echo "变量"; 现在发现一个好方法,把变量用{}括起来 echo "中间有{$i}变量&quo ...

  7. Arrange the Bulls

    题目链接 #include <stdio.h> #include <algorithm> #include <string.h> #include <iost ...

  8. Codeforces 185B(数学结论)

    要点 有不等式\(x^ay^bz^c=a^ab^bc^c(\frac{x}{a})^a(\frac{y}{b})^b(\frac{z}{c})^c<=a^ab^bc^c(\frac{x+y+z} ...

  9. Nginx功能介绍

    Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的. 从2004年发布至今,凭借开元的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也可作 ...

  10. HTML——制作一个简易菜单栏

    识点写在注释中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...