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

HDU 1242 rescue

2014-10-02 16:38 183 查看
这题要注意 题目中的 each 这个字眼,所以有多个可能 'r'存在,所以从被救的人身上展开搜索比较简单.

一开始不知道要使用优先队列,所以一开始是WA.

优先队列的操作和队列相似,但是队列中的front()函数要用top()函数代替,其他的操作类似.

#include<iostream>
#include<queue>
#define maxn 205
char map[maxn][maxn];
int visit[maxn][maxn];
using namespace std;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int m,n;
bool ok(int i,int j)
{
return map[i][j]!='#'&& i>0 &&i<=n &&j>0 && j<=m ;
}
struct node
{
int x,y,time;
friend bool operator <(const node &a,const node &b)
{
return a.time>b.time ;
}
};
int bfs(int x,int y)
{
int i;
node st,ed;
priority_queue<node>que;  //定义一个优先队列
memset(visit,0,sizeof(visit));
st.x=x;
st.y=y;
st.time=0;
visit[st.x][st.y]=1;
que.push(st);
while(!que.empty())
{
st=que.top();
que.pop();
if(map[st.x][st.y]=='r')
return st.time;
for(i=0;i<4;i++)
{
ed.x=st.x+dir[i][0];
ed.y=st.y+dir[i][1];
if(ok(ed.x,ed.y)&&!visit[ed.x][ed.y])
{
visit[ed.x][ed.y]=1;
if(map[ed.x][ed.y]=='x')
ed.time=st.time+2;
else
ed.time=st.time+1;
que.push(ed);
}
}
}
return -1;

}
int main()
{
//freopen("1242.txt","r",stdin);
int i,j;
int x,y,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>map[i][j];
// scanf("%s",map[i]);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(map[i][j]=='a')
{
x=i;
y=j;
break;
}
ans=bfs(x,y);
if(ans==-1)
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",ans);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: