HDU 3533
来源:互联网 发布:程序员都用什么浏览器 编辑:程序博客网 时间:2024/05/17 08:11
HDU 3533
/*
这题代码量太恶心了,中间还隔了一个星期写起来就和重写一样费劲
预处理处每个Castle的最远射程
然后存一个dp[i][j][k],表示(i,j)这个点在k时刻时能不能走到
判断Castle是否能射中某个人时那里比较啰嗦,不过没找到更好的写法
*/
#include <bits/stdc++.h>using namespace std;const int MAXN = 100 + 5;struct Castle{ int per, vel; int x, y; int dx, dy; int maxDis;}ca[MAXN];int caCnt;int n, m;int power;char str[10];struct Node{ int x, y, d; Node(){} Node(int _x, int _y, int _d){x = _x, y = _y, d = _d;}};bool dp[MAXN][MAXN][MAXN * 10];queue<Node>que;int dirx[] = {-1, 0, 1, 0, 0};int diry[] = {0, 1, 0, -1, 0};bool validPos(int x, int y) {if(x >= 0 && x <= n && y >= 0 && y <= m) return true; else return false;}bool validDis(int x, int tx, int midx){ if(abs(x - midx) < abs(tx - midx)) return true; else return false;}int main(){// freopen("HDU 3533.in", "r", stdin); while(scanf("%d%d%d%d", &n, &m, &caCnt, &power) != EOF) { for(int i = 0 ; i < caCnt ; i++) { scanf("%s%d%d%d%d", str, &ca[i].per, &ca[i].vel, &ca[i].x, &ca[i].y); if(str[0] == 'N') ca[i].dx = -1, ca[i].dy = 0; if(str[0] == 'S') ca[i].dx = 1, ca[i].dy = 0; if(str[0] == 'W') ca[i].dx = 0, ca[i].dy = -1; if(str[0] == 'E') ca[i].dx = 0, ca[i].dy = 1; } for(int i = 0 ; i < caCnt ; i++) { int maxDis; if(ca[i].dx < 0 || ca[i].dy < 0) maxDis = -1; else if(ca[i].dx > 0) maxDis = n + 1; else maxDis = m + 1; for(int j = 0 ; j < caCnt ; j++) { if(i == j) continue; if(ca[i].dx && ca[i].y == ca[j].y) { if(ca[i].x < ca[j].x && ca[i].dx > 0) maxDis = min(ca[j].x, maxDis); else if(ca[i].x > ca[j].x && ca[i].dx < 0) maxDis = max(maxDis, ca[j].x); } else if(ca[i].dy && ca[i].x == ca[j].x) { if(ca[i].y < ca[j].y && ca[i].dy > 0) maxDis = min(ca[j].y, maxDis); else if(ca[i].y > ca[j].y && ca[i].dy < 0) maxDis = max(maxDis, ca[j].y); } } ca[i].maxDis = maxDis; }// puts("///***Castle");// for(int i = 0 ; i < caCnt ; i++){// printf("dx = %d, dy = %d, per = %d, vel = %d", ca[i].dx, ca[i].dy, ca[i].per, ca[i].vel);// printf("maxDis = %d\n", ca[i].maxDis);// printf("x = %d, y = %d\n", ca[i].x, ca[i].y);// }// puts("***///Castle"); memset(dp, 0, sizeof dp); dp[0][0][power] = 0; while(!que.empty()) que.pop(); que.push(Node(0, 0, power)); int ans = -1; while(!que.empty()) { Node node = que.front(); que.pop(); for(int i = 0 ; i < 5 ; i++) { int tx = node.x + dirx[i]; int ty = node.y + diry[i]; if(validPos(tx, ty) && dp[tx][ty][node.d - 1] == 0) { int ok = 1; for(int j = 0 ; j < caCnt ; j++) {// if(j == 0) {// printf("dx = %d, ca[j].y = %d, ty = %d\n");// printf("ca[j].x - tx = %d, ca[j].dx = %d\n", ca[j].x - tx, ca[j].dx);// printf("validDis = %d", validDis(tx, ca[j].maxDis, ca[j].x));// } if(tx == ca[j].x && ty == ca[j].y) ok = 0; else if(ca[j].dx && ca[j].y == ty && (ca[j].x - tx) / ca[j].dx < 0 && validDis(tx, ca[j].maxDis, ca[j].x)) { int Dis = abs(ca[j].x - tx); if(Dis % ca[j].vel != 0) continue; if(power - node.d + 1 - Dis / ca[j].vel < 0) continue; if((power - node.d + 1 - Dis / ca[j].vel) % ca[j].per != 0) continue; ok = 0; } else if(ca[j].dy && ca[j].x == tx && (ca[j].y - ty) / ca[j].dy < 0 && validDis(ty, ca[j].maxDis, ca[j].y)) { int Dis = abs(ca[j].y - ty); if(Dis % ca[j].vel != 0) continue; if(power - node.d + 1 - Dis / ca[j].vel < 0) continue; if((power - node.d + 1 - Dis / ca[j].vel) % ca[j].per != 0) continue; ok = 0; } if(ok == 0) break; }// printf("node.x = %d, node.y = %d, node.d = %d\n", node.x, node.y, node.d);// printf("tx = %d, ty = %d, ok = %d\n", tx, ty, ok);// system("pause"); if(ok && dp[tx][ty][node.d - 1] == 0) { if(node.d > 0) que.push(Node(tx, ty, node.d - 1)); dp[tx][ty][node.d - 1] = 1; if(tx == n && ty == m) { ans = node.d - 1; break; } } } } if(ans != -1) break; } if(ans != -1 ) printf("%d\n", power - ans); else puts("Bad luck!"); } return 0;}
0 0
- HDU 3533
- HDU-3533
- BFS-hdu-3533-Escape
- HDU 3533 Escape
- HDU 3533 Escape
- HDU-3533-Escape(BFS)
- hdu 3533 搜索+预处理
- HDU-3533 Escape
- HDU 3533 广搜
- hdu 3533 secape
- HDU 3533 Escape
- HDU 3533 BFS
- [BFS] HDU 3533
- hdu
- hdu
- HDU
- hdu ()
- hdu
- Android问题:ScrollView默认位置不是最顶部最全解决方案
- 5.2 anvil模块
- node.js系统找不到指定文件报错
- 解决Firefox下input button内文字垂直居中
- HDU-1425(sort)
- HDU 3533
- Android从系统图库中选择图片的源代码
- hdu 5653 Bomber Man wants to bomb an Array dp
- 算法笔记之常用查找与排序
- 设置注册局锁以及增加域名安全监控
- JDK容器与并发—List—LinkedList
- BZOJ 3295 动态逆序对(CDQ分治)
- 关于抽象类和接口
- 5.3 postfix的ACL规则