HDU-1242-Rescue
http://acm.hdu.edu.cn/showproblem.php?pid=1242
bfs即可,可能有多个’r’,而’a’只有一个,从’a’开始搜,找到的第一个’r’即为所求
需要注意的是这题宽搜时存在障碍物,遇到’x’点是,时间+2,如果用普通的队列就并不能保证每次出队的是时间最小的元素,所以要用优先队列,第一次用优先队列,还不熟练哇
优先队列(priority_queue)的基本操作:
empty();队列为空返回1
pop();出队
push();入队
top();返回队列中优先级最高的元素
size();返回队列中元素的个数
#include
#include
#include
#include
#include
using namespace std;
char map[205][205];
int visit[205][205];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m;
struct node
{
int x,y;
int time;
friend bool operator < (const node &a,const node &b) //时间小的先出队
{
return a.time>b.time;
}
};
int go(int x,int y)
{
if(0<=x&&xque; //定义一个优先队列
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(go(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()
{
int i,j;
int x,y,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i