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, ...
随机推荐
- js用"."和"[]"获取属性的区别
在JavaScript中通常使用”."运算符来存取对象的属性的值.或者使用[]作为一个关联数组来存取对象的属性. 对象的属性和方法统称为对象的成员. 访问对象的属性 在JavaScript中 ...
- HTML页面弹出窗口调整代码总结
弹出跟你当前的窗口有没有菜单工具栏没有关系,你只要在页面中写一个脚本它就弹出了.比如<a href=# onclick="window.open('xxx.aspx','窗口名称',' ...
- 利用oracle session context 向oracle传值
有时候,我们在执行数据库请求时,需要向数据库传一些应用程序的上下文信息,比如当前应用的用户.举个场景,我们要通过触发器记录对某些关键表的修改日志,日志包括修改的表,字段,字段的值,修改的时间,当然非常 ...
- NHibernate 打不开工厂有可能是这几个原因
1. 属性必须虚拟化. 2.属性必须要有Id 字段 3.数据库必须要是创建好的数据库.
- 手动配置webpack之React
安装 1.安装react转译相关依赖包: npm安装: npm install --save-dev babel-core babel-loader babel-preset- ...
- Postgresql 10 自带扩展模块功能说明
adminpackadminpack提供了许多支持功能,pgAdmin 和其他管理和管理工具可以使用它们来提供其他功能,例如远程管理服务器日志文件.所有这些功能的使用仅限于超级用户. citext 该 ...
- String,StringBuffer和StringBuilder
String,StringBuffer和StringBuilder分别应该在什么情况下使用? String 是Java的字符串类,其实质上也是用Char类型存储的,但是除了hash属性,其他的属性都声 ...
- jquery中的$(this)和this
在jquery中,存在$(this)和this. 其中常见的是出现在事件处理函数中. 首先先来理解jquery对象. jquery对象其实就是DOM对象的集合. 比如:$('a')[0];------ ...
- Codeforces 161E(搜索)
要点 标签是dp但搜索一发就能过了. 因为是对称矩阵所以试填一下就是一个外层都填满了,因此搜索的深度其实不超过5. 显然要预处理有哪些素数.在这个过程中可以顺便再处理出一个\(vector:re[le ...
- 1e9个兵临城下(容斥原理)
链接:https://ac.nowcoder.com/acm/contest/321/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...