称号:

网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示)。你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长、下一个、左、向右移动到下一个单元格。

不论什么时候都不能在障碍格中。也不能走到迷宫之外。

起点和终点保证是空地。

分析:图的BFS。

  1. #include <iostream>
  2. #include <string>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. const int MAXN = 500;
  7. int maze[MAXN][MAXN], vis[MAXN][MAXN], dist[MAXN][MAXN], fa[MAXN][MAXN], last_dir[MAXN][MAXN];
  8. int n, m, xs, ys, xt, yt;
  9.  
  10. int dx[] = {-1, 1, 0, 0};
  11. int dy[] = {0, 0, -1, 1};
  12. char name[] = "UDLR";
  13.  
  14. void print_path(int x, int y) { //以递归的方式打印路径
  15. int fx = fa[x][y] / m;
  16. int fy = fa[x][y] % m;
  17. if(fx != x || fy != y) {
  18. print_path(fx, fy);
  19. putchar(name[last_dir[x][y]]);
  20. }
  21. }
  22.  
  23. int dir[MAXN*MAXN];
  24. void print_path2(int x, int y) { //以迭代的方式打印路径
  25. int c = 0;
  26. for(;;) {
  27. int fx = fa[x][y] / m;
  28. int fy = fa[x][y] % m;
  29. if(fx == x && fy == y) break;
  30. dir[c++] = last_dir[x][y];
  31. x = fx;
  32. y = fy;
  33. }
  34. while(c--) putchar(name[dir[c]]);
  35. }
  36.  
  37. queue<int> q;
  38. void bfs(int x, int y) {
  39. int u = x*m+y;
  40. dist[x][y] = 0; //初始化自己到自己的距离就是0
  41. fa[x][y] = u; //起点的父亲节点就是自己。方便后面的打印操作
  42. vis[x][y] = 1;
  43. q.push(u);
  44. while(!q.empty()) {
  45. u = q.front();
  46. q.pop();
  47. x = u/m;
  48. y = u%m;
  49. for(int d = 0; d < 4; ++d) {
  50. int nx = x + dx[d];
  51. int ny = y + dy[d];
  52. if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] && !vis[nx][ny]) {
  53. int v = nx * m + ny;
  54. q.push(v);
  55. vis[nx][ny] = 1;
  56. dist[nx][ny] = dist[x][y] + 1; //走的步数+1
  57. fa[nx][ny] = v; //记录父亲结点
  58. last_dir[nx][ny] = d; //记录如今这个节点到父亲节点走的方向
  59. }
  60. }
  61. }
  62. }
  63.  
  64. int main() {
  65. cin >> n >> m >> xs >> ys >> xt >> yt;
  66. for(int i = 0; i < n; ++i) {
  67. for(int j = 0; j < m; ++j) {
  68. cin >> maze[i][j];
  69. }
  70. }
  71. memset(vis, 0, sizeof(vis));
  72. bfs(xs, ys);
  73. print_path(xt, yt);
  74. cout << endl;
  75. print_path2(xt, yt);
  76. cout << endl;
  77. return 0;
  78. }

ACM:图BFS,迷宫的更多相关文章

  1. QDUOJ 生化危机 邻接表存图+BFS

    生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...

  2. BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS

    BZOJ_3073_[Pa2011]Journeys_线段树优化建图+BFS Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N ...

  3. (图 BFS)走迷宫

    题目: 给一个迷宫,求出从起点到终点的路径.迷宫 src.txt 文件内容如下,第一行是迷宫的行列数,后面行是迷宫,1表示可行走,0表示不可以通过,起点是最左上角,终点是最右下角: 解析: 其实就是图 ...

  4. HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...

  5. ZOJ 3781 - Paint the Grid Reloaded - [DFS连通块缩点建图+BFS求深度][第11届浙江省赛F题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Time Limit: 2 Seconds      Me ...

  6. HDU 4444:Walk(思维建图+BFS)***

    http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给出一个起点一个终点,给出n个矩形的两个对立顶点,问最少需要拐多少次弯可以从起点到达终点,如果不能输 ...

  7. 算法系列之图--BFS

    广度优先搜索以源结点s为出发点,算法始终将已发现和未发现结点之间的边界,沿其广度方向向外扩展.也即算法需要在发现所有距离源结点s为k的所有结点之后才会去发现距离源结点距离为k+1的其他结点. talk ...

  8. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  9. 【BZOJ3417】Poi2013 Tales of seafaring 分层图BFS

    [BZOJ3417]Poi2013 Tales of seafaring Description 一个n点m边无向图,边权均为1,有k个询问 每次询问给出(s,t,d),要求回答是否存在一条从s到t的 ...

随机推荐

  1. Heritrix与Nutch对比

    Nutch 开发语言:Java http://lucene.apache.org/nutch/ 简介: Apache的子项目之一,属于Lucene项目下的子项目. Nutch是一个基于Lucene,类 ...

  2. 西南民大oj(两园交求面积)

    西南民大oj:http://www.swunacm.com/acmhome/welcome.do?method=index 我的几何不可能那么可爱 时间限制(普通/Java) : 1000 MS/ 3 ...

  3. Python每隔一秒钟打印当地时间

    import threading,time global t def sayHello(): print time.strftime('%Y-%m-%d %H:%M:%S',time.localtim ...

  4. eclipse failed to create the java virtual machine 问题图文解析(转)

    clipse failed to create  the java virtual  machine 解决方法: 1.问题现象 2.java虚拟机初始化失败!寻找eclipse解压路径 3.寻找ecl ...

  5. Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant

    Maven, Ivy, Grape, Gradle, Buildr, SBT, Leiningen, ant

  6. hdu2412(树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2412 题意:给定一棵关系树 , 从中选择一些点 , 使这些点均不存在亲子关系 , 最多能取多少个点 , ...

  7. nginx学习12 ngx_cycle_t 和 ngx_init_cycle

    在nginx在启动过程,ngx_init_cycle这个函数最初始工作.变量的初始化存储在ngx_cycle_t这个结构体中,为了深入了解这个函数都做了那些初始化工作,就化时间研究了一下.并写下来以便 ...

  8. [POJ 3735] Training little cats (结构矩阵、矩阵高速功率)

    Training little cats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9613   Accepted: 2 ...

  9. 【PLSQL】package包的使用

    ************************************************************************   ****原文:blog.csdn.net/clar ...

  10. hdu 4472 Count (递推)

    Count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...