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 ...
随机推荐
- ServletConfig与ServletContext
ServletConfig与ServletContext对象详解 一.ServletConfig对象 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...
- windows系统查看80端口被占用的程序并结束该程序运行
一.背景 最近系统更新以后,我在Idea中适用80端口启动项目的时候发现80端口被占用了,就查了资料看怎么找到占用80端口的程序并结束其运行,下面把解决方式共享给大家. 二.解决步骤 1.首先打开控制 ...
- 解决eclipse中egit中的cannot open git-upload-pack问题
一.背景 今天在使用eclipse的egit插件进行检出远程代码到本地时,出现了cannot open git-upload-pack错误,后经过努力解决该问题,记录下方便回顾和交流! 二.出现原因 ...
- Android中通过反射获取资源Id
package com.cp.utils; import android.content.Context; public class CPResourceUtil { public static in ...
- NYOJ题目768移位密码
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtIAAAJqCAIAAACJkTDlAAAgAElEQVR4nO3du3Ljvpa34b4J574Qx7
- Lattice Diamond 和 ispLEVER 的不同之处
Lattice Diamond 和 ispLEVER.有一些不同,尤其是如何管理工程的不同,包括以下几点: 1.ispLEVER 有多种工程类型,不同的程序文件类型需要不同的类型的工程:但是Diamo ...
- 很少有人会告诉你的Android开发基本常识
原文:很少有人会告诉你的Android开发基本常识. 文章介绍了一些关于开发.测试.版本管理.工具使用等方面的知识.
- 微信token验证失败的解决方法
一.问题由来 在使用URL和Token启用微信公众平台开发模式消息接口的时候,我们会碰到下面三种情况 1. token校验失败 这样回头检查一下各项配置是否正确.如果确定配置没有问题,请按下面的方法检 ...
- .NET NLog 详解(二)
Git是个很好的源码管理系统,你可以瞬间切换为任何历史版本.为了更好的解析NLog这个组件,我们将时钟倒拨回2004年.(注意:NLog v0.9 has been released 是在2005-0 ...
- WPF中查看PDF文件
需要打开PDF文件时,我们第一印象就是使用Adobe Reader.在开发中,经常会遇到需要展示PDF文件的需求.我们会借助于Adobe Reader的Active控件来实现.不过这需要客户的机器上安 ...