BFS(判断状态) HDOJ 3533 Escape
题意:一个人从(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的更多相关文章
- HDU 3533 Escape(大逃亡)
HDU 3533 Escape(大逃亡) /K (Java/Others) Problem Description - 题目描述 The students of the HEU are maneu ...
- hdu-5652 India and China Origins(二分+bfs判断连通)
题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- HDU 3533 Escape(BFS+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=10 ...
- HDU 3533 Escape(bfs)
Escape Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 3533 Escape bfs 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=3533 一道普通的bfs,但是由于代码实现出了bug还是拖了很久甚至对拍了 需要注意的是: 1.人不能经过炮台 2 ...
- HDU 3533 Escape (BFS + 预处理)
Escape Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 3533 Escape BFS搜索
题意:懒得说了 分析:开个no[100][100][1000]的bool类型的数组就行了,没啥可说的 #include <iostream> #include <cstdio> ...
- 【搜索】 HDU 3533 Escape BFS 预处理
要从0,0 点 跑到m,n点 路上会有k个堡垒发射子弹.有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 能够上下左右或者站着不动 每步都须要消耗能量 一共同拥有en ...
- HDU 3681 Prison Break(BFS+二分+状态压缩DP)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
随机推荐
- php面向对象加载类、常用设计模式
加载类: include("./Ren.class.php"); include "./Ren.class.php"; 用此方法的时候include后面要加空格 ...
- ld returned 1 exit status"的解决办法
在Linux下创建线程时,编译时会出现下面的错误,[root@linuxserver 807]# gcc -o 22 22.c/tmp/cc21HcoW.o(.text+0x4c): In funct ...
- 检查C++内存泄露
#ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_ ...
- java ---线程wait/notify/sleep/yield/join
一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线 ...
- Mac与iPhone屏幕录制
1. Mac电脑屏幕录制 1.1 文件->新建屏幕录制 1.2 点击红色按钮 1.3 截取需要录制的屏幕部分,点击开始录制 1.4 点击工具栏的停止按钮,停止录制 1.5 然后会 ...
- NYOJ题目113字符串替换
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAr4AAAHvCAIAAAA930vtAAAgAElEQVR4nO3dPVLjysIG4G8T5CyE2A ...
- CLR via C#(07)-静态类,分部类
一. 静态类-Static 静态类是一些不能实例化的类,它的作用是将一些相关的成员组合到一起,像我们常见的Math, Console等.静态类由static关键字标识,静态类成员也只能是st ...
- ReentrantLock和synchronized两种锁定机制
ReentrantLock和synchronized两种锁定机制 >>应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicit ...
- Delphi 的知识体系
第一部分 快速开发的基础 第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开 ...
- ODATA WEB API(二)----ODATA服务与客户端
一.概述 ODATA不经可以作为WebAPI建立相应的WEBAPI控制器,还可以建立ODataControl控制器,能够通过插件建立第三方ODataClinet类库:调用和使用数据变得简单可行. 二. ...