HDU 5040 Instrusive(BFS+优先队列)
题意比较啰嗦。
就是搜索加上一些特殊的条件,比如可以在原地不动,也就是在原地呆一秒,如果有监控也可以花3秒的时间走过去。
这种类型的题目还是比较常见的。以下代码b[i][j][x]表示格子i行j列在x时刻有监控照的到。因为只有4个方向,所以只需要时间对4取模就行。具体细节见代码。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
const int maxn = ;
const int dx[] = {, , , -, }, dy[] = {, -, , , };
char mp[maxn][maxn];
int b[maxn][maxn][];
int T, n, kase;
bool vis[maxn][maxn][];
struct Node {
int x, y, step;
bool operator < (const Node &b) const {
return step > b.step;
}
};
Node tar;
int bfs(int x, int y)
{
memset(vis, false, sizeof(vis));
priority_queue<Node> Q;
Node cur, nex;
cur.x = x; cur.y = y; cur.step = ;
vis[x][y][] = true;
Q.push(cur);
while (!Q.empty())
{
cur = Q.top(); Q.pop();
if (tar.x == cur.x && tar.y == cur.y) return cur.step;
for (int i = ; i < ; i++)//最后一个状态是可以呆在原地不动
{
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
if (nx < || ny < || nx >= n || ny >= n) continue;
if (mp[nx][ny] == '#') continue;
nex = cur;
if (b[nx][ny][cur.step % ] || b[cur.x][cur.y][cur.step % ])//如果下一个位置有监控或者当前这个位置监控的到
{
if (nx == cur.x && ny == cur.y && !vis[nx][ny][(cur.step + ) % ])//如果当前这个位置监控的到,
{
nex.step++;
vis[nx][ny][nex.step % ] = true;
Q.push(nex);
}
else if (!vis[nx][ny][(cur.step + ) % ])//如果下一个监控的到
{
nex.x = nx; nex.y = ny;
nex.step += ;
vis[nx][ny][nex.step % ] = true;
Q.push(nex);
}
}
else if (!vis[nx][ny][(cur.step + ) % ])//否则直接走
{
nex.x = nx; nex.y = ny; nex.step++;
vis[nx][ny][nex.step % ] = true;
Q.push(nex);
}
}
}
return -;
}
int main()
{
scanf("%d", &T);
while (T--)
{
int x, y;
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%s", mp[i]);
memset(b, , sizeof(b));
for (int i = ; i < n; i++)
{
for (int j = ; j < n; j++)
{
if (mp[i][j] == 'M')
{
x = i; y = j;
}
else if (mp[i][j] == 'N')
{
b[i][j][] = b[i][j][] = b[i][j][] = b[i][j][] = ;//它本身这个位置不管任意时刻都被监控到
if (i - >= ) b[i - ][j][] = ;//表示紧挨着它上面的那个在1秒的时候被监控到
if (j + < n) b[i][j + ][] = ;//紧挨着它右边的在第2秒的时候,意思就是下一秒
if (i + < n) b[i + ][j][] = ;//下两秒
if (j - >= ) b[i][j - ][] = ;//下三秒在忘左边的位置被监控的到
}
else if (mp[i][j] == 'E')
{
b[i][j][] = b[i][j][] = b[i][j][] = b[i][j][] = ;
if (i - >= ) b[i - ][j][] = ;
if (j + < n) b[i][j + ][] = ;
if (i + < n) b[i + ][j][] = ;
if (j - >= ) b[i][j - ][] = ;
}
else if (mp[i][j] == 'S')
{
b[i][j][] = b[i][j][] = b[i][j][] = b[i][j][] = ;
if (i - >= ) b[i - ][j][] = ;
if (j + < n) b[i][j + ][] = ;
if (i + < n) b[i + ][j][] = ;
if (j - >= ) b[i][j - ][] = ;
}
else if (mp[i][j] == 'W')
{
b[i][j][] = b[i][j][] = b[i][j][] = b[i][j][] = ;
if (i - >= ) b[i - ][j][] = ;
if (j + < n) b[i][j + ][] = ;
if (i + < n) b[i + ][j][] = ;
if (j - >= ) b[i][j - ][] = ;
}
else if (mp[i][j] == 'T')
{
tar.x = i; tar.y = j;
}
}
}
printf("Case #%d: %d\n", ++kase, bfs(x, y));
}
return ;
}
HDU 5040 Instrusive(BFS+优先队列)的更多相关文章
- hdu 5040 Instrusive【BFS+优先队列】
11733274 2014-09-26 12:42:31 Accepted 5040 62MS 1592K 4848 B G++ czy 先转一个优先队列的用法: http://www.cppblog ...
- HDU 1242 Rescue(BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...
- hdu 1072 Nightmare (bfs+优先队列)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1072 Description Ignatius had a nightmare last night. H ...
- hdu 5040 Instrusive
Instrusive Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tota ...
- HDU——1242Rescue(BFS+优先队列求点图最短路)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列
网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...
- HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- hdu 2102 A计划 具体题解 (BFS+优先队列)
题目链接:pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102 这道题属于BFS+优先队列 開始看到四分之中的一个的AC率感 ...
随机推荐
- 隐藏和显示 ng-show ng-hide
<div ng-controller='DeathraymenueController'> <button ng-click="toggleMenue()" ...
- /proc/sys/net/ipv4/ip_forward
ip地址分公有地址和私有地址,public address是由INIC(internet network information center)负责,这些ip地址分配给注册并向INIC提出申请的组织机 ...
- 阻止文件不被上传到iCloud-b
有空用下 http://www.cocoachina.com/bbs/read.php?tid=86244 http://www.ooso.net/archives/617 http://blog.c ...
- [HDOJ 5155] Harry And Magic Box
题目链接:HDOJ - 5155 题目大意 有一个 n * m 的棋盘,已知每行每列都至少有一个棋子,求可能有多少种不同的棋子分布情况.答案对一个大素数取模. 题目分析 算法1: 使用容斥原理与递推. ...
- JQuery 判断IPad、IPhone、Android是横屏还是竖屏(Window.Orientation实现)
在ipad.iphone网页开发中,我们很可能需要判断是横屏或者竖屏.下面就来介绍如何用 jQuery 判断iPad.iPhone.Android是横屏还是竖屏的方法. 代码如下: function ...
- Problem A: The Monocycle
uva10047:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...
- 详解Spring中的CharacterEncodingFilter
在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodin ...
- Church encoding
In mathematics, Church encoding is a means of representing data and operators in the lambda calculus ...
- bzoj1146
这是一道无比繁琐的题目话说这道题使我第一次练dfs序,比较感动:首先dfs序就是在dfs过程中按照访问的顺序给每个点标上两个“时间戳”一个是第一次访问到点i时的时间戳c[i],一个是访问完以i为根时的 ...
- (转载)提高mysql插入数据的速度
(转载)http://blog.csdn.net/bhq2010/article/details/7376352 需要在mysql中插入2000万条记录,用insert语句插入速度很有限,每秒钟几百条 ...