标签:des style blog java color os
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11700 Accepted Submission(s): 3653
Special Judge
题意:就是让你找到从(0,0)到(n-1,m-1)的最短路径,并把这条路径给输出来,若没有则输出God please help our poor hero,而且输出路径时如果遇到怪物,与它战斗了几秒也要输出来。
解题思路:用BFS+优先队列的方法,我们不断寻找下一个位置,并把耗时最少的又作为起点,寻找下一个位置,如果能找到,则第一次找到的一定是最短耗时的,但这一题有一个难点,就是难在如何存储我找到的最短路径。我们开一个结构体数组,当我们找到下一个位置的时候,在下一个节点中存储上一个节点的位置,这样我们就可以从终点递推来找到整条路,然后把它存储在另一个数组中,这样我们就直接输出这个数组就可以了。
贴出代码:
#include <stdio.h> #include <iostream> #include <queue> using namespace std; int n, m, mark, minx; int visited[105][105]; int dir[4][2] = {0, -1, 1, 0, 0, 1, -1, 0}; int Footx[10005], Footy[10005]; //作为转换的路径数组 char map[105][105]; struct foot //存储路径的结构体 { int x, y; }Foot[105][105]; struct node //优先队列结构体,耗时少的优先 { int x, y; int time; friend bool operator < (node a, node b) { return a.time > b.time; } }; int Judge(int x, int y) //判断这个点是否符合 { if(x<0 || x>=n || y<0 || y>=m) return 1; if(map[x][y] == ‘X‘ || visited[x][y]) return 1; return 0; } void BFS(int startx, int starty, int time) //BFS搜索最短路 { priority_queue <node> Q; struct node Node, temp; Node.x = startx; Node.y = starty; Node.time = 0; visited[startx][starty] = 1; Q.push(Node); while(!Q.empty()) { Node = Q.top(); Q.pop(); if(Node.x == n-1 && Node.y == m-1) { minx = Node.time; mark = 1; return; } for(int i = 0; i<4; i++) { temp.x = Node.x+dir[i][0]; temp.y = Node.y+dir[i][1]; temp.time = Node.time+1; if(Judge(temp.x, temp.y)) continue; if(map[temp.x][temp.y] == ‘.‘) { Foot[temp.x][temp.y].x = Node.x; //将上一个节点存储下来 Foot[temp.x][temp.y].y = Node.y; visited[temp.x][temp.y] = 1; Q.push(temp); } if(map[temp.x][temp.y]>=‘1‘ && map[temp.x][temp.y]<=‘9‘) { Foot[temp.x][temp.y].x = Node.x; Foot[temp.x][temp.y].y = Node.y; temp.time = temp.time+map[temp.x][temp.y]-‘1‘+1; visited[temp.x][temp.y] = 1; Q.push(temp); } } } } void Show() { printf("It takes %d seconds to reach the target position, let me show you the way.\n", minx); int k = 0, i =minx, num; Footx[k] = n-1; Footy[k] = m-1; while(i--) //将存储下来的路径转换出来,我们就可以知道走过了那些点 { if(Footx[k] == 0 && Footy[k] == 0) break; k++; Footx[k] = Foot[ Footx[k-1] ][ Footy[k-1] ].x; Footy[k] = Foot[ Footx[k-1] ][ Footy[k-1] ].y; } num = 1; for(int j = k-1; j>=0; j--) //根据走过的这些点来进行输出 { if(map[ Footx[j] ][ Footy[j] ] == ‘.‘) printf("%ds:(%d,%d)->(%d,%d)\n", num++, Footx[j+1], Footy[j+1], Footx[j], Footy[j]); if(map[ Footx[j] ][ Footy[j] ]>=‘1‘ && map[ Footx[j] ][ Footy[j] ]<=‘9‘) { printf("%ds:(%d,%d)->(%d,%d)\n", num++, Footx[j+1], Footy[j+1], Footx[j], Footy[j]); for(int t = 1; t<=map[ Footx[j] ][ Footy[j] ]-‘0‘; t++) { printf("%ds:FIGHT AT (%d,%d)\n", num++, Footx[j], Footy[j]); } } } } int main() { while(scanf("%d%d", &n, &m)!=EOF) { for(int i = 0; i<n; i++) { for(int j = 0; j<m; j++) { cin>>map[i][j]; visited[i][j] = 0; } } mark = 0; BFS(0, 0, 0); if(mark) Show(); else printf("God please help our poor hero.\n"); printf("FINISH\n"); } return 0; }
hdu 1026 Ignatius and the Princess I (BFS+优先队列),布布扣,bubuko.com
hdu 1026 Ignatius and the Princess I (BFS+优先队列)
标签:des style blog java color os
原文地址:http://www.cnblogs.com/fengxmx/p/3858585.html