HDU 1026 迷宫战斗问题 使用了优先队列
2012-08-23 09:48
447 查看
#include <iostream> #include <queue> #include <stdio.h> #include <string.h> using namespace std; const int MAXN = 100; struct node { int x, y; int time; friend bool operator <(node a, node b) //time小的优先级高 { return a.time > b.time; } }; priority_queue<node> que; //优先队列 struct cmp { int nx, ny; //记录前驱 char c; }map[MAXN][MAXN]; int n, m; int fight[MAXN][MAXN], mark[MAXN][MAXN]; int bfs() { int k; int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; node now, next; while(!que.empty()) que.pop(); now.x = n - 1; now.y = m - 1; if(map[now.x][now.y].c >= '1' && map[now.x][now.y].c <= '9') { now.time = map[n - 1][m - 1].c - '0'; fight[now.x][now.y] = map[now.x][now.y].c - '0'; } else now.time = 0; que.push(now); while(!que.empty()) { now = que.top(); que.pop(); if(now.x ==0 && now.y == 0) return now.time; for(k = 0; k < 4; k++) { next.x = now.x + dir[k][0]; next.y = now.y + dir[k][1]; if(next.x >= 0 && next.x < n && next.y >= 0 && next.y < m && !mark[next.x][next.y] && map[next.x][next.y].c != 'X') { if(map[next.x][next.y].c >= '1' && map[next.x][next.y].c <= '9') { next.time = now.time + map[next.x][next.y].c - '0' + 1; fight[next.x][next.y] = map[next.x][next.y].c - '0'; } else next.time = now.time + 1; que.push(next); map[next.x][next.y].nx = now.x; map[next.x][next.y].ny = now.y; mark[next.x][next.y] = 1; } } } return -1; } int main() { while(scanf("%d%d", &n, &m) != EOF) { for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf(" %c", &map[i][j].c); //前面的空格很关键,或者直接用cin //cin >> map[i][j].c; mark[i][j] = fight[i][j] = 0; } } for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cout << map[i][j].c ; } cout << endl; } mark[n - 1][m - 1] = 1; int flag = bfs(); if(flag != -1) { printf("It takes %d seconds to reach the target position, let me show you the way.\n",flag); int sec = 1, x = 0, y = 0; int tx, ty; while(sec != flag + 1) { printf("%ds:(%d,%d)->(%d,%d)\n",sec++,x,y,map[x][y].nx,map[x][y].ny); for(int i = 0; i < fight[map[x][y].nx][map[x][y].ny]; i++) printf("%ds:FIGHT AT (%d,%d)\n",sec++,map[x][y].nx,map[x][y].ny); tx = map[x][y].nx; ty = map[x][y].ny; x = tx; y = ty; } } else printf("God please help our poor hero.\n"); printf("FINISH\n"); } return 0; }
相关文章推荐
- hdu 1026 优先队列 + 路径保存
- HDU 1072 优先队列的使用
- 哈理工OJ1621_迷宫问题II【BFS+优先队列】
- HDU 1026 Ignatius and the Princess I 优先队列 +BFS.
- 3377 接水问题2 优先队列的使用
- hdu1026 Ignatius and the Princess I (优先队列 BFS)
- hdu 1026 Ignatius and the Princess I 优先队列 + bfs
- 使用栈和队列求解迷宫问题(标准库)
- hdu1026【bfs优先队列】
- poj 3984 迷宫问题 【BFS + 优先队列 + stack路径记录】
- HDU 6015 Skip the Class 优先队列 map的使用
- HDU_1242——二维空间搜索,使用优先队列BFS
- HDU 1026 Ignatius and the Princess I 迷宫范围内的搜索剪枝问题
- 【搜索之BFS + 优先队列】杭电 hdu 1026 Ignatius and the Princess I
- hdu 2680 dijkstra 使用优先队列优化
- HDU--杭电--1026--Ignatius and the Princess I--广搜--直接暴力0MS,优先队列的一边站
- hdu 1026:Ignatius and the Princess I(优先队列 + bfs广搜。ps:广搜AC,深搜超时,求助攻!)
- HDU 1026 Ignatius and the Princess I 迷宫广搜剪枝问题
- 哈理工OJ 1621迷宫问题II(优先队列广搜)
- HDU 1026 Ignatius and the Princess I 【优先队列+路径输出】