Nightmare(HDU 1072)
来源:互联网 发布:ppt数据分析图怎么弄 编辑:程序博客网 时间:2024/06/05 04:55
题目大意:一般的搜索问题,用BFS能够0ms解决。有剩余时限让你去走迷宫,有一个特殊的东西可以让你的剩余时间重置。
具体的要求是:
1. We can assume the labyrinth is a 2 array.(二维迷宫)
2. Each minute, Ignatius could only get to one of the nearest area, and he should not walk out of the border, of course he could not walk on a wall, too.(不能走墙)
3. If Ignatius get to the exit when the exploding time turns to 0, he can't get out of the labyrinth.(刚好在剩余0S走出也不行)
4. If Ignatius get to the area which contains Bomb-Rest-Equipment when the exploding time turns to 0, he can't use the equipment to reset the bomb.(刚好在0s重置时间也不行)
5. A Bomb-Reset-Equipment can be used as many times as you wish, if it is needed, Ignatius can get to any areas in the labyrinth as many times as you wish.(你可以使用重置若干次,不过在我的代码当中,是没考虑,不知道是不是测试数据太弱了,就那么AC了。)
6. The time to reset the exploding time can be ignore, in other words, if Ignatius get to an area which contain Bomb-Rest-Equipment, and the exploding time is larger than 0, the exploding time would be reset to 6.(一走到该道具,剩余时间立刻重置,不需要考虑时间)
2. Each minute, Ignatius could only get to one of the nearest area, and he should not walk out of the border, of course he could not walk on a wall, too.(不能走墙)
3. If Ignatius get to the exit when the exploding time turns to 0, he can't get out of the labyrinth.(刚好在剩余0S走出也不行)
4. If Ignatius get to the area which contains Bomb-Rest-Equipment when the exploding time turns to 0, he can't use the equipment to reset the bomb.(刚好在0s重置时间也不行)
5. A Bomb-Reset-Equipment can be used as many times as you wish, if it is needed, Ignatius can get to any areas in the labyrinth as many times as you wish.(你可以使用重置若干次,不过在我的代码当中,是没考虑,不知道是不是测试数据太弱了,就那么AC了。)
6. The time to reset the exploding time can be ignore, in other words, if Ignatius get to an area which contain Bomb-Rest-Equipment, and the exploding time is larger than 0, the exploding time would be reset to 6.(一走到该道具,剩余时间立刻重置,不需要考虑时间)
测试数据:
33 32 1 11 1 01 1 34 82 1 1 0 1 1 1 01 0 4 1 1 0 4 11 0 0 0 0 0 0 11 1 1 4 1 1 1 35 81 2 1 1 1 1 1 4 1 0 0 0 1 0 0 1 1 4 1 0 1 1 0 1 1 0 0 0 0 3 0 1 1 1 4 1 1 1 1 1
4-113
以下是我的AC代码:一般的BFS模板根据条件改编
#include<iostream>#include <queue>#include <cstring>using namespace std;short map[10][10], vis[10][10];int Div[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };int n, m;int sx, sy, ex, ey;int times = -1;struct pos{int x;int y;int times;int Time;friend bool operator <(pos a, pos b)//使用优先队列,使得剩余时间最多的先出队{return a.Time<b.Time;}};void bfs(){memset(vis, 0, sizeof (vis));priority_queue<pos>q;pos p, mid;p.x = sx;p.y = sy;p.times = 0;p.Time = 6;q.push(p);vis[sx][sy] = 1;while (!q.empty()){p = q.top();q.pop();if (p.x == ex&&p.y == ey&&p.Time > 0){times = p.times;return;}if (p.Time == 1)//这个是针对0秒不可行,即当剩余时间为1S是还没走出,那永远不可以。continue;for (int i= 0; i < 4; i++)//这边加入一个判断,是为了判断该点附近有没有时间重置的地点。{mid = p;//具体理解看第三个测试数据吧,还好测试数据给的良心,不然完全不会想到。mid.x = p.x + Div[i][0];//道行还是太浅了。mid.y= p.y + Div[i][1];if (mid.x >= 1 && mid.x <= n&&mid.y <= m&&mid.y >= 1 && map[mid.x][mid.y] == 4&&p.Time<5){mid.Time = 6;mid.times++;//本来想解释一下,但发现不会解释,看不懂的还是看测试数据三理解吧q.push(mid);p.Time = 5;p.times += 2;break;}}for (int i = 0; i < 4; i++){mid = p;mid.x = p.x + Div[i][0];mid.y = p.y + Div[i][1];mid.times++;mid.Time--;if (mid.x>n || mid.x<1 || mid.y>m || mid.y < 1||!map[mid.x][mid.y]||vis[mid.x][mid.y])continue;if (map[mid.x][mid.y] == 4){vis[mid.x][mid.y] = 1;mid.Time = 6;q.push(mid);continue;}else{vis[mid.x][mid.y] = 1;q.push(mid);}}}}int main(){int t;cin >> t;while (t--){cin >> n >> m;times = -1;for (int i = 1; i <= n;i++)for (int j = 1; j <= m; j++){cin >> map[i][j];if (map[i][j] == 2){sx = i; sy = j;}if (map[i][j] == 3){ex = i; ey = j;}}bfs();cout << times << endl;}}
0 0
- Nightmare(HDU 1072)
- hdu 1072 Nightmare (bfs)
- hdu 1072 Nightmare (BFS)
- hdu 1072 Nightmare bfs()
- hdu 1072Nightmare(bfs)
- HDU-#1072 Nightmare(BFS)
- HDU 1072:Nightmare(BFS)
- hdu 1072 Nightmare(bfs)
- hdu 1072 Nightmare(bfs)
- hdu-1072-Nightmare(bfs)
- HDU 1072 Nightmare(BFS)
- hdu 1072 Nightmare (BFS)
- HDU-1072 Nightmare(bfs)
- hdu 1072 Nightmare(dfs)(转)
- hdu 1072 Nightmare(BFS第一弹)
- hdu 1072 Nightmare (广搜)
- HDU 1072 Nightmare(搜索-DFS)
- HDU 1072Nightmare(BFS+剪枝)
- Linux core 文件介绍
- 16进制字符串转化为10进制数(k_eckel转自微软高校博客K_eckel's mindview)
- HashSet
- lightoj 1032 Fast Bit Calculations 数位dp
- Git中文问题
- Nightmare(HDU 1072)
- java 中的 final修饰符
- Python学习:命令行运行,循环结构
- 《数据结构与算法分析》读书笔记——hash表
- Oracle最后部分复习内容
- POJ 1017 Packets 悼念死去的模拟
- CentOS下安装tar包/rpm包
- Java Web项目包目录结构分享
- 一个计算自己活了多少天的函数