您的位置:首页 > 产品设计 > UI/UE

HDOJ 1242 Rescue 优先队列+bfs

2014-09-30 00:43 357 查看
题目大意:

给你一个n*m的二维矩阵,包含墙壁,路,守卫,a,和r(可以不止一个),守卫所在的地方可以通过,但解决他需要花费1单位的时间,从一个点走向旁边的点也需要1单位的时间。求至少有一个r走到a的最短的时间。

题目分析:

因为r不只有一个,所以应该反过来从a搜索到r。由于通过守卫的时间需要两个单位,应用优先队列,让时间少的先行。

源代码:

#include<iostream>
#include<queue>
using namespace std;
char map[201][201];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,ax,ay,flag;
struct node
{
int x,y,step;
friend bool operator < (node a,node b)
{
return a.step>b.step;
}
}w,p;
int bfs();
int main()
{
while(cin>>n>>m)
{
flag=0;
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='a')
{
ax=i;
ay=j;
}
}
getchar();
}
int min;
min=bfs();
if(flag==1)
cout<<min<<endl;
else
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
return 0;
}
int bfs()
{
priority_queue<node> q;
w.x=ax;w.y=ay;w.step=0;
while(!q.empty())
q.pop();
q.push(w);
while(!q.empty())
{
p=q.top();
q.pop();
if(map[p.x][p.y]=='r')
{
flag=1;
return p.step;
}
for(int i=0;i<4;i++)
{
w.x=p.x+dir[i][0];
w.y=p.y+dir[i][1];
w.step=p.step+1;
if(w.x>=0&&w.x<n&&w.y>=0&&w.y<m&&map[w.x][w.y]!='#')
{
if(map[w.x][w.y]=='x') w.step++;
if(map[w.x][w.y]!='r')
map[w.x][w.y]='#';
q.push(w);
}
}
}
}

当前水平评级:5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm hdoj 搜索 bfs 源代码