HDU 1242 rescue
2014-10-02 16:38
183 查看
这题要注意 题目中的 each 这个字眼,所以有多个可能 'r'存在,所以从被救的人身上展开搜索比较简单.
一开始不知道要使用优先队列,所以一开始是WA.
优先队列的操作和队列相似,但是队列中的front()函数要用top()函数代替,其他的操作类似.
一开始不知道要使用优先队列,所以一开始是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; }
相关文章推荐
- hdu 1242 Rescue(优先队列 && 广搜BFS)
- hdu 1242 Rescue 优先队列问题
- hdu 1242 Rescue
- hdu 题目1242 Rescue (BFS)
- HDU 1242 Rescue
- hdu 1242 Rescue 解题报告
- 【搜索入门专题1】 hdu1242 J - Rescue c++ stl容器之优先队列+BFS
- hdu 1242 Rescue (优先队列)
- Rescue--hdu1242
- HDU 1242 Rescue(图)
- HDU 1242 rescue【广搜】
- hdu 1242 Rescue<java>
- HDU 1242 Rescue (DFS)
- hdu 1242 Rescue
- HDU_1242_Rescue
- HDU 1242 Rescue(BFS+优先队列)
- HDU 1242 Rescue(bfs+优先队列)
- hdu 1242 Rescue(优先队列 && 广搜BFS)
- hdu 1242 Rescue(bfs)
- hdu 1242 ( Rescue )