题目传送门

题意:一个人从(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. Hibernate双向一对一对象关系模型映射

    一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 create table emp ( eid int primary key auto_increment, ename varch ...

  2. 细谈WEB标准

    最近有些朋友很是疑惑web标准是什么,我在这里先做一个总结,有更好的见解的可以私信给我! 首先切入正题之前先谈一下什么叫DOCTYPE,DOCTYPE是document type(文档类型)的简写,主 ...

  3. October 4th 2016 Week 41st Tuesday

    Patience! The windmill never strays in search of the wind. 耐心等待!风车从不跑去找风. Sometimes we need to be pa ...

  4. AFNetworking(AFN)总结

    AFNetworking(AFN) ----主要做下载上传之用 //他是干啥的?发送请求,主要做下载上传之用 (苹果自带有获取服务器数据的方法NSURLConnection send,AFNetwor ...

  5. NYOJ题目98成绩转换

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAJhCAIAAADJ5jGJAAAgAElEQVR4nO3dq3LkSPg36O8mzH0hxn ...

  6. Genymotion

    @Genymotion相关文件下载地址 http://pan.baidu.com/s/1nu9nReh @虚拟机网络代理设置 Normal 0 7.8 磅 0 2 false false false ...

  7. Java -- 子类使用super调用父类的方法A,A 调用了方法B,子类也override方法B,那么super.A()最终调用到了子类的B方法

    public class SuperClass{ public void printA(){ System.out.print("SuperClass-printA"); prin ...

  8. 防止别人ping自己的服务器

    禁止被ping [root@GitLab ~]# echo >/proc/sys/net/ipv4/icmp_echo_ignore_all 无法被ping [root@NB ipv4]# pi ...

  9. 七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解

    EXIF(Exchangeable Image File)是 “可交换图像文件” 的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息,简单来说,Ex ...

  10. 重温WCF之WCF传输安全(十三)(1)前期准备之证书制作(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/12/2682372.html 一.WCF中的安全方式 说到安全就会涉及到认证,消息一致性和机密性 ...