zoj 1649(hdu 1242)Rescue(广搜)

继续练习搜索,bfs,优先队列的应用

优先队列,知道咋用,但还是了解的太少,还要继续理解

单词记不住……

priority 优先

新发现:

front()原本是栈的取顶函数,但在一般queue中也可以用,但在优先队列中就不行,必须用top()取顶……

#include<stdio.h> #include<string.h> #include<iostream> #include<queue> using namespace std; int dir[4][2]={0,1,0,-1,1,0,-1,0}; int si,sj,n,m; char map[201][201]; struct node { int x,y; int time; }; priority_queue<node> q; bool operator<(node a,node b) { return a.time>b.time; } int fj(int a,int b) { if(a<0||b<0||a>n-1||b>m-1)return 0; else return 1; } void getmap() { int i,j; memset(map,0,sizeof(map)); for(i=0;i<n;i++) for(j=0;j<m;j++) { scanf("%1s",&map[i][j]); if(map[i][j]=='a') si=i,sj=j; } } int bfs(int si,int sj) { int i,flag[201][201]; node cur,next; while(!q.empty()) //养成好习惯,清空 q.pop(); memset(flag,0,sizeof(flag)); cur.x=si, cur.y=sj, cur.time=0, flag[cur.x][cur.y]=1; q.push(cur); while(!q.empty()) { cur=q.top(); //取顶函数,注意 q.pop(); for(i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; if(!flag[next.x][next.y] && fj(next.x,next.y) && map[next.x][next.y]!='#') { flag[next.x][next.y]=1; if(map[next.x][next.y]=='x')next.time=cur.time+2; else next.time=cur.time+1; if(map[next.x][next.y]=='r') return next.time; q.push(next); } } } return -1; } int main() { int ans; while(~scanf("%d%d",&n,&m)) { getmap(); ans=bfs(si,sj); if(ans==-1) printf("Poor ANGEL has to stay in the prison all his life./n"); else printf("%d/n",ans); } return 0; } 

 

 

 

你可能感兴趣的:(zoj 1649(hdu 1242)Rescue(广搜))