HDU 1072 Nightmare
2014-07-25 11:04
435 查看
hdu 1072
题目大意就是一个人身上有一个炸弹,这个炸弹6分钟后爆炸,在迷宫中,0是墙,不能走; 1可以走, 2是开始位置,3是出口,4是炸弹充值装置,如果走到那个位置时,炸弹事件大于0,就会把、时间重置为 6 分钟(这里我开始理解错了,以为他获得了这个装置,可以随时使用,意思就是相当于增加6分钟);走到出口时,剩余的时间必须大于0;这个题,用BFS,开一个结构体,记录走的步数,还有所用的时间,或者剩余的时间,都行,每走一步,时间减一,走到4,时间置为6,在走,所以可能会走重复的路,所以普通的标记不行,但如果不用标记,会导致内存使用超出限制,所以灵活的标记,每走到这一步,记录下这一步剩余的时间,如果下次走到这个点,时间多了,就放入队列;
代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <queue> using namespace std; int map[10][10]; int vis[10][10]; int movex[4] = {0,0,-1,1}; int movey[4] = {-1,1,0,0}; int n, m, a, b, c, d; int s, flag; struct point { int x, y, step, time; } st; queue<point>q; void bfs(point st); int main() { //freopen("1.txt","w",stdout); int t; int i, j; scanf("%d", &t); while (t--) { scanf("%d %d", &n, &m); memset(map, 0, sizeof(map)); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &map[i][j]); } } flag = 0; memset(vis, 0, sizeof(vis)); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (map[i][j] == 2) { a = i; b = j; } if (map[i][j] == 3) { c = i; d = j; } } } st.x = a; st.y = b; st.step = 0; st.time = 6; bfs(st); if (flag) { printf("%d\n", s); } else { printf("-1\n"); } } } void bfs(point st) { while (!q.empty()) { q.pop(); } q.push(st); while (!q.empty()) { point now = q.front(); q.pop(); //printf("x = %d,y = %d,step = %d,time = %d,k = %d\n",now.x,now.y,now.step,now.time,now.k); for (int i = 0; i < 4; i++) { int xx = now.x, yy = now.y; xx += movex[i]; yy += movey[i]; if (now.time <= 0) { continue; } if (map[xx][yy] == 3&&now.time>0) { s = now.step + 1; flag = 1; return; } if (xx >= 0 && xx < n && yy >= 0 && yy < m && map[xx][yy] != 0) { point next = now; next.step += 1; next.time -= 1; if(map[xx][yy]==4) { next.time = 6; } if(next.time>1 && vis[xx][yy]<next.time) //这里,时间多了,放入队列 { vis[xx][yy]=next.time; next.x = xx; next.y = yy; q.push(next); } } } } }
相关文章推荐
- HDU 1072 Nightmare
- HDU 1072 Nightmare
- hdu_1072_Nightmare(BFS)
- hdu1072 Nightmare(bfs)
- HDU 1072 Nightmare
- hdu 1072 Nightmare bfs()
- HDU-1072Nightmare(bfs+可重复访问)
- hdu1072(Nightmare)bfs
- hdu1072 Nightmare (BFS)
- HDU 1072 Nightmare
- HDU 1072 NYOJ 483 Nightmare -- BFS+允许回头
- hdu_1072_Nightmare(BFS)
- hdu 1072 Nightmare
- hdu-1072 Nightmare(DFS+剪枝)
- HDU 1072 Nightmare( 身上带有定时炸弹的他能否在炸弹爆炸之前离开—— BFS+DP思想)
- HDU 1728 逃离迷宫 + H 4000 DU 1072 Nightmare
- HDU 1072 nightmare
- hdu 1072 Nightmare
- HDU 1072 Nightmare(DFS或BFS+剪枝)
- HDU-#1072 Nightmare(BFS)