我是靠谱客的博主 幸福斑马,最近开发中收集的这篇文章主要介绍hdu 1242 Rescue(BFS+优先队列),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

起初只是用DFS做,但后来发现问题太多了,起点是一个,但可能有多个士兵,要找到最小的距离即要求每一个子问题的结果都是最小值。用深度优先搜索自然不能每次都返回较小值。而广度优先搜索就像使用了分身术一样,4个方向都有friend去找angel,各自返回自己的最小值,所以思路就是BFS+优先队列。

<pre name="code" class="cpp"><pre name="code" class="cpp">#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
char imap[211][211];
int n,m,x_s,y_s,x_e,y_e;
struct node
{
int x,y,step;
friend bool operator<(node n1,node n2) // 不能是 bool operator<(node n1,node n2)哦
{
return n2.step<n1.step;
}
};
int dir[4][2]={1,0, -1,0, 0,1, 0,-1};
//不用{{},{}……}
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&imap[x][y]!='#')return 1;
return 0;
}
int BFS(){
priority_queue<node>q;
node cur,next;
int i;
cur.x=x_s;
cur.y=y_s;
cur.step=0;
imap[cur.x][cur.y]='#';
q.push(cur);
while(!q.empty())
{
cur=q.top();
q.pop();
if(cur.x==x_e && cur.y==y_e)
return cur.step; //返回最小值
for(i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(!judge(next.x,next.y)) continue;
if(imap[next.x][next.y]=='x') next.step=cur.step+2;
else
next.step=cur.step+1;
imap[next.x][next.y]='#';
q.push(next);
}
//cout<<q.top().x<<" "<<q.top().y<<endl;
}
return -1;
}
int main()
{
//freopen("cin.txt","r",stdin);
int ans;
int i,j;
while(~scanf("%d%d",&n,&m))
{
memset(imap,0,sizeof(imap));
getchar();
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%c",&imap[i][j]);
if(imap[i][j]=='r'){ x_s=i; y_s=j; }
else if(imap[i][j]=='a'){
x_e=i; y_e=j; }
}
getchar();
}
ans=BFS();
if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life.n");
else
printf("%dn",ans);
}
return 0;
}





最后

以上就是幸福斑马为你收集整理的hdu 1242 Rescue(BFS+优先队列)的全部内容,希望文章能够帮你解决hdu 1242 Rescue(BFS+优先队列)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部