题目传送门

题意:一个人从(0, 0)逃往(n, m),地图上有朝某个方向开炮的炮台,问最少逃脱步数

分析:主要在状态是否OK,当t时刻走到(x,y),炮台是否刚好打中,因为只能是整数,所以用整除判断。题意不清楚,有些坑点。

#include <bits/stdc++.h>
using namespace std; const int N = 1e2 + 5;
struct Point {
int dir, t, v; //N 1 E 2 S 3 W 4
}p[N][N];
struct Node {
int x, y, step;
Node() {}
Node(int x, int y, int step) : x (x), y (y), step (step) {}
};
int dx[5] = {-1, 1, 0, 0, 0};
int dy[5] = {0, 0, -1, 1, 0};
bool vis[N][N][N*10];
int n, m, k, d; bool check(int x, int y, int tim) {
if (x < 0 || x > n || y < 0 || y > m || vis[x][y][tim] || p[x][y].dir != 0) return false;
else return true;
} bool check2(int x, int y, int tim) {
for (int i=x-1; i>=0; --i) { //up
if (p[i][y].v == 0) continue;
if (p[i][y].dir != 3) break;
int dis = x - i;
if (dis % p[i][y].v != 0) break;
int t = tim - dis / p[i][y].v;
if (t % p[i][y].t == 0) return false;
else break;
}
for (int i=x+1; i<=n; ++i) { //down
if (p[i][y].v == 0) continue;
if (p[i][y].dir != 1) break;
int dis = i - x;
if (dis % p[i][y].v != 0) break;
int t = tim - dis / p[i][y].v;
if (t % p[i][y].t == 0) return false;
else break;
}
for (int i=y-1; i>=0; --i) { //left
if (p[x][i].v == 0) continue;
if (p[x][i].dir != 2) break;
int dis = y - i;
if (dis % p[x][i].v != 0) break;
int t = tim - dis / p[x][i].v;
if (t % p[x][i].t == 0) return false;
else break;
}
for (int i=y+1; i<=m; ++i) { //right
if (p[x][i].v == 0) continue;
if (p[x][i].dir != 4) break;
int dis = i - y;
if (dis % p[x][i].v != 0) break;
int t = tim - dis / p[x][i].v;
if (t % p[x][i].t == 0) return false;
else break;
} return true;
} int BFS(void) {
Node s;
s.x = s.y = s.step = 0;
queue<Node> que; que.push (s);
vis[s.x][s.y][0] = true;
while (!que.empty ()) {
Node u = que.front (); que.pop ();
if (u.step > d) continue;
if (u.x == n && u.y == m && u.step <= d) {
return u.step;
}
for (int i=0; i<5; ++i) {
int tx = u.x + dx[i], ty = u.y + dy[i], tsp = u.step + 1;
if (!check (tx, ty, tsp)) continue;
if (!check2 (tx, ty, tsp)) continue;
vis[tx][ty][tsp] = true;
que.push (Node (tx, ty, tsp));
}
} return -1;
} int main(void) {
map<char, int> mp;
mp['N'] = 1; mp['E'] = 2; mp['S'] = 3; mp['W'] = 4;
while (scanf ("%d%d%d%d", &n, &m, &k, &d) == 4) {
memset (vis, false, sizeof (vis));
memset (p, 0, sizeof (p));
char str[3]; int t, v, x, y;
getchar ();
for (int i=0; i<k; ++i) {
scanf ("%s%d%d%d%d", &str, &t, &v, &x, &y);
p[x][y].dir = mp[str[0]];
p[x][y].t = t; p[x][y].v = v;
}
int ans = BFS ();
if (ans == -1) puts ("Bad luck!");
else printf ("%d\n", ans);
} return 0;
}

  

BFS(判断状态) HDOJ 3533 Escape的更多相关文章

  1. HDU 3533 Escape(大逃亡)

    HDU 3533 Escape(大逃亡) /K (Java/Others)   Problem Description - 题目描述 The students of the HEU are maneu ...

  2. hdu-5652 India and China Origins(二分+bfs判断连通)

    题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K ...

  3. HDU 3533 Escape(BFS+预处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=10 ...

  4. HDU 3533 Escape(bfs)

    Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. HDU 3533 Escape bfs 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=3533 一道普通的bfs,但是由于代码实现出了bug还是拖了很久甚至对拍了 需要注意的是: 1.人不能经过炮台 2 ...

  6. HDU 3533 Escape (BFS + 预处理)

    Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  7. HDU 3533 Escape BFS搜索

    题意:懒得说了 分析:开个no[100][100][1000]的bool类型的数组就行了,没啥可说的 #include <iostream> #include <cstdio> ...

  8. 【搜索】 HDU 3533 Escape BFS 预处理

    要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹.有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 能够上下左右或者站着不动 每步都须要消耗能量  一共同拥有en ...

  9. HDU 3681 Prison Break(BFS+二分+状态压缩DP)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

随机推荐

  1. objective-c数组笔记

    数组与可变数组 2015年6月14日 1.数组 数组的初始化方式 1.初始化一个空数组 NSArray *array = [[NSArray alloc] init];//不可变数组,数组内不可以添加 ...

  2. Mac 安装 eclipse

    总是看着安卓的代码感觉手痒痒,闲来无事在 Mac 端安装了一下eclipse 提高逼格. 1.官网(http://www.eclipse.org/downloads/)下载所需的安装包,具体步骤如图: ...

  3. September 3rd 2016 Week 36th Saturday

    Calculation never made a hero. 举棋不定,难以称雄. We change. We have to. Or we spend the rest of our lives f ...

  4. jquery获得select option的值 和对select option的操作

    jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...});   //为Se ...

  5. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  6. 假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。

    CSomething a(); CSomething b(2); CSomething c[3]; CSomething &ra = b; CSomething d=b; CSomething ...

  7. UVA 624 CD

    主要是打印路径有点麻烦,然后就是用于标记的数组要开大点,不然会狂wa不止,而且还不告诉你re #include <cstdio> #include <iostream> #in ...

  8. kvm 下运行的 WINWS7磁盘空间不足 增加磁盘 实战(这个有问题,还未解决)

    创建一个新硬盘: [root@NB vhost]# qemu-img create -f qcow2 add_win_desk.img 5G Formatting encryption=off clu ...

  9. openfire 服务器名称:后面的黄色叹号

    然后点击重新获取证书,然后重新启动服务,问题解决!

  10. 关于plsql连接oracle数据库session失效时间设置

    http://bbs.csdn.net/topics/350152441 http://www.linuxidc.com/Linux/2015-09/123286.htm