UVA 1600 Patrol Robert 巡逻机器人 (启发搜索BFS)
非常适合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)的更多相关文章
- 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)
题意:从(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)
题意: 给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= ...
- UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)
题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...
- UVA 1600 Patrol Robot
带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: #include <iostream> #include & ...
- Uva 1600 Patrol Robot (BFS 最短路)
这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #inclu ...
- UVa 1600 Patrol Robot【BFS】
题意:给出一个n*m的矩阵,1代表墙,0代表空地,不能连续k次穿过墙,求从起点到达终点的最短路的长度 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0, ...
随机推荐
- ADT-Bundle--Android开发环境快速搭建
http://blog.csdn.net/aizquan/article/details/8974750
- A Beginner's Guide to HTTP and REST
http://code.tutsplus.com/tutorials/a-beginners-guide-to-http-and-rest--net-16340 Hypertext Transfer ...
- HDU - 6156 2017CCPC网络赛 Palindrome Function(数位dp找回文串)
Palindrome Function As we all know,a palindrome number is the number which reads the same backward a ...
- jdbcTemplate简单使用
package com.bizvane.spider.tools; import org.apache.commons.dbcp.BasicDataSource; import org.springf ...
- nginx是如何处理一个请求的(包含https配置)
配置https首先要有ssl证书,这个证书目前阿里有免费的,但如果自己做实验,也是可以自签证书,只不过不受信 openssl genrsa -des3 -out server.key 1024 ...
- uoj#308. 【UNR #2】UOJ拯救计划(并查集)
传送门 如果把答案写出来,就是\(\sum_{i=1}^ki!\times {k\choose i}\times f_i\),其中\(f_i\)为选\(i\)种颜色方案 发现如果\(i\geq 3\) ...
- Java程序的运行机制和JVM
1. Java语言比较特殊, 由Java编写的程序需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件).这种字节码不是可执行性的,必须使用 ...
- vue -- key的特殊作用
v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可 eg ...
- background-attachment:fixed不兼容性
ios系统和某些移动端background-attachment:fixed不兼容性,没有任何效果,但可以hack一下就可以了,代码如下: ps:想在哪个标签加背景,可以在它class后:before ...
- dp优化1——sgq(单调队列)
该文是对dp的提高(并非是dp入门,dp入门者请先参考其他文章) 有时候dp的复杂度也有点大...会被卡. 这几次blog大多数会讲dp优化. 回归noip2017PJT4.(题目可以自己去百度).就 ...