Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11710 Accepted Submission(s): 3661
Special Judge
1.Ignatius can only move in four directions(up, down, left, right), one step per second. A step is defined as follow: if current position is (x,y), after a step, Ignatius can only stand on (x-1,y), (x+1,y), (x,y-1) or (x,y+1).
2.The array is marked with some characters and numbers. We define them like this:
. : The place where Ignatius can walk on.
X : The place is a trap, Ignatius should not walk on it.
n : Here is a monster with n HP(1<=n<=9), if Ignatius walk on it, it takes him n seconds to kill the monster.
Your task is to give out the path which costs minimum seconds for Ignatius to reach target position. You may assume that the start position and the target position will never be a trap, and there will never be a monster at the start position.
题解:给定一个地图,让你从左上角走到右下角,仅仅能上下左右四个方向。有的格子有怪兽,移动格子和打怪都要消耗时间。求到达终点所消耗的最短时间和路径。
题解:最短时间能够用优先队列求出来。路径用二维结构体数组来记录。每一个节点保存它从哪儿来,该点消耗的时间。
#include <cstdio> #include <queue> #include <cstring> #define maxn 102 using std::priority_queue; struct Node{ int x, y, time; friend bool operator<(Node a, Node b){ return a.time > b.time; } }; struct node{ int x, y, time; } path[maxn][maxn]; char map[maxn][maxn]; int n, m, mov[][2] = {0, 1, 0, -1, -1, 0, 1, 0}; bool check(int x, int y) { return x >= 0 && y >= 0 && x < n && y < m && map[x][y] != 'X'; } bool BFS(int& times) { Node now, next; now.x = now.y = now.time = 0; priority_queue<Node> Q; Q.push(now); while(!Q.empty()){ now = Q.top(); Q.pop(); if(now.x == n - 1 && now.y == m - 1){ times = now.time; return true; } for(int i = 0; i < 4; ++i){ next = now; next.x += mov[i][0]; next.y += mov[i][1]; if(!check(next.x, next.y)) continue; ++next.time; path[next.x][next.y].x = now.x; path[next.x][next.y].y = now.y; path[next.x][next.y].time = 0; if(map[next.x][next.y] != '.'){ next.time += map[next.x][next.y] - '0'; path[next.x][next.y].time = map[next.x][next.y] - '0'; } map[next.x][next.y] = 'X'; Q.push(next); } } return false; } void printPath(int times, int x, int y) { if(times == 0) return; times -= path[x][y].time; printPath(times - 1, path[x][y].x, path[x][y].y); printf("%ds:(%d,%d)->(%d,%d)\n", times++, path[x][y].x, path[x][y].y, x, y); while(path[x][y].time--) printf("%ds:FIGHT AT (%d,%d)\n", times++, x, y); } int main() { int times, i; while(scanf("%d%d", &n, &m) != EOF){ for(i = 0; i < n; ++i) scanf("%s", map[i]); memset(path, 0, sizeof(path)); if(BFS(times)){ printf("It takes %d seconds to reach the target position, let me show you the way.\n", times); printPath(times, n - 1, m - 1); }else puts("God please help our poor hero."); puts("FINISH"); } return 0; }