题目地址:HDU 1242
这个题相比于普通的bfs有个特殊的地方,经过士兵时会额外消耗时间,也就是说此时最先搜到的时候不一定是用时最短的了。需要全部搜一遍才可以。这时候优先队列的好处就显现出来了。利用优先队列,可以让队列中的元素按时间排序,让先出来的总是时间短的,这样的话,最先搜到的一定是时间短的,就不用全部搜一遍了。PS:我是为了学优先队列做的这题。。不是为了这题而现学的优先队列。。
代码如下;
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include<algorithm> using namespace std; int vis[300][300], n, m; char mp[300][300]; int jx[]={0,0,1,-1}; int jy[]={1,-1,0,0}; struct node { int x, y, ans; bool operator<(const node &a) const{ return ans>a.ans; } }; void bfs(int x, int y) { memset(vis,0,sizeof(vis)); priority_queue<node>q; node f1, f2; f1.x=x; f1.y=y; f1.ans=0; q.push(f1); vis[x][y]=1; while(!q.empty()) { f1=q.top(); q.pop(); if(mp[f1.x][f1.y]=='r') { printf("%d\n",f1.ans); return ; } for(int i=0;i<4;i++) { f2.x=f1.x+jx[i]; f2.y=f1.y+jy[i]; if(f2.x>=0&&f2.x<n&&f2.y>=0&&f2.y<m&&!vis[f2.x][f2.y]&&mp[f2.x][f2.y]!='#') { vis[f2.x][f2.y]=1; if(mp[f2.x][f2.y]=='x') { f2.ans=f1.ans+2; } else { f2.ans=f1.ans+1; } q.push(f2); } } } printf("Poor ANGEL has to stay in the prison all his life.\n"); } int main() { int i, a, b, j; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%s",mp[i]); for(j=0;j<m;j++) { if(mp[i][j]=='a') { a=i; b=j; } } } //printf("%d %d\n",a,b); bfs(a,b); } return 0; }
HDU 1242 Rescue(优先队列+bfs),布布扣,bubuko.com
时间: 2024-11-03 03:46:40