题目地址

题目与最基本的BFS迷宫的区别就是有一些障碍,可以通过建立三维数组,标记某个地方有障碍不能走。另一个点是输出路径,对此建立结构体时要建立一个pre变量,指向前一个的下标。这样回溯(方法十分经典)就可以顺利的输出。

这道题难度的确很小,可是我却花了近两个小时才顺利AC,实在是现在水平太不足了,要努力学习的真的是有好多啊。不管怎样,尽力吧。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. struct grid
  7. {
  8. int x,y;//坐标
  9. int pre;//回溯前一个的下标
  10. int dir;
  11. }point[];
  12. int si,sj,ei,ej,a[],dir[][][],direction[][]={{-,},{,},{,},{,-}},vi[][];
  13. int bfs()
  14. {
  15. memset(vi,,sizeof(vi));
  16. int front=,tail=;
  17. point[front].x=si;
  18. point[front].y=sj;
  19. point[front].pre=-;
  20. grid temp,temp2;
  21. vi[si][sj]=;
  22. while(front<tail)
  23. {
  24. temp=point[front];
  25. for(int i=;i<;i++)
  26. {
  27. if(dir[temp.x][temp.y][i]==){continue;}
  28. else
  29. {
  30. temp2.x=temp.x+direction[i][];
  31. temp2.y=temp.y+direction[i][];
  32. temp2.dir=i;
  33. if(vi[temp2.x][temp2.y])
  34. continue;
  35. else
  36. {
  37. temp2.pre=front;
  38. vi[temp2.x][temp2.y]=;
  39. point[tail++]=temp2;
  40. if(temp2.x==ei&&temp2.y==ej)
  41. return (tail-);
  42. }
  43. }
  44. }
  45. front++;
  46. }
  47. }
  48. void print(int x)//经典的输出方式
  49. {
  50. if(x>)
  51. {
  52. print(point[x].pre);
  53. if(point[x].dir==)
  54. {
  55. printf("N");
  56. }
  57. else if(point[x].dir==)
  58. {
  59. printf("E");
  60. }
  61. else if(point[x].dir==)
  62. {
  63. printf("S");
  64. }
  65. else printf("W");
  66. }
  67.  
  68. }
  69. int main()
  70. {
  71. while(scanf("%d%d",&sj,&si))
  72. {
  73. int i,j,k,an;
  74. if(si==&&sj==)
  75. break;
  76. scanf("%d%d",&ej,&ei);
  77. memset(dir,,sizeof(dir));
  78. for(i=;i<=;i++)
  79. {
  80. dir[][i][]=;
  81. dir[][i][]=;
  82. dir[i][][]=;
  83. dir[i][][]=;
  84. }
  85. for(j=;j<;j++){
  86. scanf("%d %d %d %d",&a[],&a[],&a[],&a[]);//注意数据是行列与平常不同的
  87.  
  88. if(a[]==a[])
  89. {
  90. for(k=min(a[],a[])+;k<max(a[],a[])+;k++)
  91. {
  92. dir[a[]+][k][]=;
  93. dir[a[]][k][]=;
  94. }
  95. }
  96. else
  97. {
  98. for(k=min(a[],a[])+;k<max(a[],a[])+;k++)
  99. {
  100. dir[k][a[]+][]=;
  101. dir[k][a[]][]=;
  102. }
  103. }
  104. }
  105. an=bfs();
  106. print(an);
  107. puts("");
  108. }
  109. return ;
  110. }

(BFS)poj2935-Basic Wall Maze的更多相关文章

  1. poj-2935 BFS Basic Wall Maze

    Basic Wall Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3384   Accepted: 1525   ...

  2. 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题

    用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...

  3. HDU 1484 Basic wall maze (dfs + 记忆)

    Basic wall maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  5. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  6. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  7. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  8. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  9. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  10. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

随机推荐

  1. My roadway of compilers principles.

    龙书学习过程代码记录--Python3.5(毕竟第一遍看书,书里面的例子全用python写的) One 将中缀表达式翻译成后缀表达式↓ class Parser(object): def __init ...

  2. 企业信息系统——SCM

    供应链是供应商.制造商.仓库.配送中心和渠道商等构成的物流网络.同一个企业可能构成这个网络的不同组成节点,但更多的情况下是由不同的企业构成这个网络中的不同节点.例如,在某条供应链中,某个企业可能即在制 ...

  3. emacs + quicklisp + slime

  4. android混合开发,webview的java与js互操作

    android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用web ...

  5. web前端本地测试方法

    在大型项目中的前端测试与开发,通常使用git clone将整个工程目录下载下来,然后本地运行调试. 然而,当一个项目已经发布到测试机上,需要临时查看某个页面的效果或修改某个页面时,clone整个工程目 ...

  6. Redis常见用法

    using ServiceStack.Redis;using System;using System.Collections.Generic;using System.Linq;using Syste ...

  7. [充电]C++ string字符串替换

    //C++ 第一种替换字符串的方法用replace()|C++ 第二种替换字符串的方法用erase()和insert()[ C++string|C++ replace()|C++ erase()|C+ ...

  8. 安装Ifconfig

    1.ifconfig 2.whereis 检查 3.yum search ifconfig 4.分割线下面让我们安装 net-tools.x86_64 执行 yum -y install net-to ...

  9. TTL

    TTL(Time To Live )是IP协议包中的一个值,它告诉网络,数据包在网络中的时间是否太长而应被丢弃.有很多原因使包在一定时间内不能被传递到目的地.解决方法就是在一段时 间后丢弃这个包,然后 ...

  10. SELinux深入理解

    ps:今天在远程给服务器配置https的时候,一直乱码,以前做系统的系统第一件事情,就是关闭selinx,今天忘记了,然后就悲剧了... 弄了半天才弄好,镇定思痛,好好的来看下selinux 1. 简 ...