hdu 1728 逃离迷宫(搜索:BFS+优先队列)
来源:互联网 发布:日本经济数据怎么查 编辑:程序博客网 时间:2024/06/05 17:25
问在给定转弯次数内能不能到达终点
因为限制了转弯次数,所以要想到每次取转弯次数最小的情况
看了网上好多人都是BFS+DFS,找到某一方向后沿着方向一直走
但我是用优先队列解决,每次取出转弯次数最小的情况,当然这样会慢一些
解决第一次转弯不计次数的方法是判断四个方向是否能加入队列,能的话加入即可
代码如下:
#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 100#define LL long longusing namespace std;int m, n;struct Position { int x, y, k, dir; bool operator < (const Position &rhs) const { return k > rhs.k; }}start, end, cur, tmp;int g[MAXN][MAXN];bool vis[MAXN][MAXN][12][5];priority_queue<Position> q;//定义在外面不要忘了清空bool BFS(int k, int x1, int y1, int x2, int y2) { while(!q.empty()) q.pop(); memset(vis, 0, sizeof(vis)); start.x = x1; start.y = y1; start.k = 0; end.x = x2; end.y = y2; end.k = k; cur.k = 0; if(x1-1>=1 && g[x1-1][y1]==0) {//向上 cur.x = x1-1; cur.y = y1; cur.dir = 1; q.push(cur); } if(y1-1>=1 && g[x1][y1-1]==0) {//向左 cur.x = x1; cur.y = y1-1; cur.dir = 2; q.push(cur); } if(x1+1<=m && g[x1+1][y1]==0) {//向下 cur.x = x1+1; cur.y = y1; cur.dir = 4; q.push(cur); } if(y1+1<=n && g[x1][y1+1]==0) {//向右 cur.x = x1; cur.y = y1+1; cur.dir = 3; q.push(cur); } while(!q.empty()) { tmp = q.top(); q.pop(); vis[tmp.x][tmp.y][tmp.k][tmp.dir] = true; if(tmp.x==end.x && tmp.y==end.y) { return true; } if(tmp.x-1>=1 && tmp.dir!=4 && g[tmp.x-1][tmp.y]==0) {//向上 cur.x = tmp.x-1; cur.y = tmp.y; cur.dir = 1; cur.k = tmp.k; if(tmp.dir != 1) cur.k++; if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir]) q.push(cur); } if(tmp.y-1>=1 && tmp.dir!=3 && g[tmp.x][tmp.y-1]==0) {//向左 cur.x = tmp.x; cur.y = tmp.y-1; cur.dir = 2; cur.k = tmp.k; if(tmp.dir != 2) cur.k++; if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir]) q.push(cur); } if(tmp.x+1<=m && tmp.dir!=1 && g[tmp.x+1][tmp.y]==0) {//向下 cur.x = tmp.x+1; cur.y = tmp.y; cur.dir = 4; cur.k = tmp.k; if(tmp.dir != 4) cur.k++; if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir]) q.push(cur); } if(tmp.y+1<=n && tmp.dir!=2 && g[tmp.x][tmp.y+1]==0) {//向右 cur.x = tmp.x; cur.y = tmp.y+1; cur.dir = 3; cur.k = tmp.k; if(tmp.dir != 3) cur.k++; if(cur.k <= end.k && !vis[cur.x][cur.y][cur.k][cur.dir]) q.push(cur); } } return false;}int main(void) { int T, k, x1, y1, x2, y2; char ch; scanf("%d", &T); while(T--) { scanf("%d%d", &m, &n); memset(g, 0, sizeof(g)); for(int i=1; i<=m; ++i) { getchar(); for(int j=1; j<=n; ++j) { ch = getchar(); if(ch == '.') g[i][j] = 0; else g[i][j] = -1; } } scanf("%d%d%d%d%d", &k, &y1, &x1, &y2, &x2); if(BFS(k, x1, y1, x2, y2)) cout << "yes" << endl; else cout << "no" << endl; } return 0;}
0 0
- hdu 1728 逃离迷宫(搜索:BFS+优先队列)
- 逃离迷宫 HDU-1728 BFS深度搜索
- hdu 1728 逃离迷宫 普通的队列 / 优先队列
- hdu 1728 逃离迷宫(dFS+优先队列)
- hdu 1728 逃离迷宫 (bfs+循环队列)
- bfs hdu 1728 逃离迷宫
- hdu 1728 逃离迷宫 (BFS)
- hdu 1728 逃离迷宫 BFS
- HDU 1728 逃离迷宫 BFS
- HDU-1728-逃离迷宫(BFS)
- HDU 1728 逃离迷宫 BFS
- HDU 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(bfs)
- HDU 1728 逃离迷宫【bfs】
- HDU 1728 逃离迷宫【BFS】
- HDU 1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫(BFS)
- HDU 1728 逃离迷宫【BFS】
- MEF程序设计指南二:Silverlight中使用CompositionInitializer宿主MEF
- hdu 1281 棋盘游戏 枚举+最大匹配
- unity NGUI的UIInput输入的UILabel 输入超过输入框长度的文字不跟着光标走的问题解决方案-maxLines
- 打工不如创业 千元投资大回报 增值电话平台
- 在QT环境下,实例分析构造函数与析构函数的执行时机
- hdu 1728 逃离迷宫(搜索:BFS+优先队列)
- 字符串指针和字符数组的诡异问题
- 【JAVA】关于new在父子类中的使用
- 吸费电话增值电话设备 声讯平台 欢迎您的加盟
- 我就是我,颜色不一样的花火...
- 电话吸费加盟 穷人创业! 赚钱快
- OWI之direct path write
- 回拨吸费电话 打工不如创业 加值电话平台
- vi显示行号