hdu-1242-Rescue-优先队列
2014-06-28 19:15
309 查看
翻译:有一个天使被抓住了,然后关在了Moligpy监狱,这个监狱里面有墙,也有路,当然也有守卫把守!而天使的朋友们想要去救出天使,他们的任务是:抵达天使所在的位置!在监狱里,如果遇见守卫,那么必须将之杀掉,才能继续移动!我们假定在监狱中我们可以向上,下,左,右移动!每移动一次,将会消耗一个单位时间,要是遇见守卫的话,杀掉守卫还需要用时一个单位时间(所以此时用时总共为2个单位时间)!不用担心,天使的朋友对付守卫还是没问题的!
现在你的问题来了:请计算解救天使所需要的最短时间!
这个题的意思大概就是酱紫了!要计算最短时间,这个题应该是使用BFS来解决!这个题我一开始看的时候,以为天使的朋友只有一个,结果后来才发现是有多个的,
所以就不能按常规的思路来解决了!而且,这个时候,我们搜索的起点不应该是朋友的
位置了,而是天使的位置!
另外,由于有多个朋友,还要求求出最短时间,所以这里就需要应用优先队列了!
下面是我的代码:最近才学的优先队列,所以写得比较水啦!见谅!
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; int dx[4]= {1,0,-1,0}; int dy[4]= {0,1,0,-1}; //定义方向数组! int n,m,sx,sy,num; int vis[520][520]; char map[520][520]; char sos[520]= {"Poor ANGEL has to stay in the prison all his life."}; struct node { int x,y; int step; bool operator<(const node e)const { //优先队列的使用,这里是重新载入运算符! return step>e.step; } }; priority_queue<node>q; void rescue() { node now,change,ee; now.x=sx; now.y=sy; now.step=0; //这里是初始化一个点的信息!把天使的位置赋进去! q.push(now); //然后入队! while(!q.empty()) { change=q.top(); q.pop();//出队! for(int i=0; i<4; i++) { ee.x=change.x+dx[i]; ee.y=change.y+dy[i]; if(ee.x>=0&&ee.x<n&ee.y>=0&&ee.y<m&&vis[ee.x][ee.y]==0) { vis[ee.x][ee.y]=1;//标记! if(map[ee.x][ee.y]=='r') { //逆向寻找到了天使的一个朋友! num=change.step+1; return ; } if(map[ee.x][ee.y]=='x')//时间加2! ee.step=change.step+2; else ee.step=change.step+1;//时间加1! q.push(ee); } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(vis,0,sizeof(vis)); for(int i=0; i<n; i++) { scanf("%s",map[i]); for(int j=0; j<m; j++) { if(map[i][j]=='a') { sx=i; sy=j; }//逆序寻找,因为有多个r,但是a只有一个! if(map[i][j]=='#') vis[i][j]=1;//把墙标记为1 } } num=520; vis[sx][sy]=1; while(!q.empty()) q.pop();//将队列清除干净! rescue(); if(num==520) printf("%s\n",sos); else printf("%d\n",num); } return 0; }
相关文章推荐
- HDU-1242 Rescue( 广搜 + 优先队列)
- hdu 1242 Rescue(优先队列)
- hdu1242 Rescue 优先队列BFS
- hdu-1242Rescue(优先队列+bfs)
- HDU-1242Rescue(优先队列)
- HDU 1242 Rescue(BFS,优先队列)
- HDU 1242 Rescue (BFS + 优先队列)
- hdu 1242 Rescue 优先队列
- hdu 1242 Rescue 搜索 bfs 优先队列
- hdu-1242Rescue(bfs搜索+优先队列)
- HDU 1242 rescue (优先队列模板题)
- HDU 1242 Rescue(优先队列)
- HDU 1242——Rescue(优先队列)
- HDU 1242 Rescue(营救)(优先队列+BFS)
- hdu 1242 Rescue(BFS优先队列)
- HDU 1242 - Rescue(BFS 优先队列)
- Hdu 1242 & Zoj 1649 Rescue (优先队列+BFS)
- ZOJ 1649 && HDU 1242 Rescue (BFS + 优先队列)
- HDU 1242 Rescue (广搜 + 优先队列)
- [HDU] 1242 Rescue -不使用优先队列来找寻最短路径