HDU 1242 (BFS+优先队列)
来源:互联网 发布:不要网络的ipad游戏 编辑:程序博客网 时间:2024/05/05 22:53
初次使用优先队列;
有的人用普通队列也能过,但是,我只能说,那是数据太水了;
普通队列能过的将类似下面两句改改顺序:
int xx[4] = {1,-1,0,0};
int yy[4] = {0,0,1,-1};
也许就过不了了;
因为如果用普通方法,最后得到的是最优步数,而不是最优时间;
来自Jason的解释:
普通队列+bfs确实是蒙对的,因为击败守卫需要消耗时间1,因此普通队列每一次出队列的元素只是步数上最优,但不一定是时间上最优的,这时即使我们把整个迷宫搜完以最小值作为最优依然不行,因为每一步处理完成都会把该状态标记为已处理vis[i][j]=1,因此,只要有一步不是最优,就会影响后面的结果。这题的正确做法是优先队列,每一次出队都是出时间最少的,这样可以保证每一步最优,并且一旦搜到目标即可立刻结束。
#include <iostream>#include <queue>#include <cstdio>#include <string>#include <cstring>using namespace std;char map[205][205];int xx[4] = {1,-1,0,0};int yy[4] = {0,0,1,-1}; bool visit[205][205];int n,m;struct point{int x;int y;int step;friend bool operator < (point a, point b){return a.step > b.step;}}a,b;int bfs(){int flag = 0;memset(visit,false,sizeof(visit));visit[a.x][a.y] = true;priority_queue<point> q;q.push(a);while(!q.empty()){b = q.top();q.pop();if(map[b.x][b.y] == 'r'){flag = b.step;break;}for(int i = 0; i < 4; i++){a.x = b.x + xx[i];a.y = b.y + yy[i];a.step = b.step + 1;if(!visit[a.x][a.y]&&map[a.x][a.y]!='#'){visit[a.x][a.y] = true;if(map[a.x][a.y]=='x')a.step = a.step + 1;q.push(a);}}}return flag;}int main(){while(cin>>n>>m){for(int i=0;i<=n+1;++i) map[i][0]=map[i][m+1]='#'; for(int i=0;i<=m+1;++i) map[0][i]=map[n+1][i]='#';for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin>>map[i][j];if(map[i][j]=='a'){a.x = i;a.y = j;a.step = 0;}}}int step = bfs();if(step){cout<<step<<endl;;}else{cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;;}}return 0;}/*7 8#.#####.#.a#..r.#..#x.....#..#.##...##...#..............*/
- HDU 1242 (BFS+优先队列)
- HDU 1242 BFS+优先队列
- hdu 1242 (bfs+优先队列)
- HDU 1242 BFS+优先队列
- HDU 1242 BFS+优先队列
- hdu 1242Rescue(bfs+优先队列)
- hdu 1242 Rescue (优先队列+bfs)
- HDU 1242 Rescue(BFS +优先队列)
- hdu 1242 Rescue(bfs+优先队列)
- HDU 1242 Rescue 优先队列+BFS
- HDU 1242 (BFS+优先队列)
- HDU 1242 Rescue(BFS,优先队列)
- HDU 1242 Rescue(BFS+优先队列)
- hdu-1242-Rescue(优先队列 BFS)
- HDU 1242 Rescue(优先队列 + 多源BFS)
- [ACM] hdu 1242 Rescue (BFS+优先队列)
- hdu 1242 Rescue(BFS优先队列)
- HDU 1242 Rescue (BFS+优先队列)
- 如何在CentOS6.4中设置VNC多用户登录
- sql经典语句
- 学科前沿技术(集体智慧及其常用算法)
- Discuz论坛 创始人密码忘记解决办法!
- android中button控件的添加
- HDU 1242 (BFS+优先队列)
- Threadlocal源码分析
- Logical and visual Treehttp://wpftutorial.net/LogicalAndVisualTree.html
- c# 传值调用和传引用调用
- MPI计算pi值π
- input()与raw_input()
- xml创建节点
- 文本编辑器<一>文字输出
- hadoop mapreduce多表关联