DFS(深度搜索)和BFS(广度搜索)

广度优先搜索(BFS),利用对列的特性,让下一节点全部执行完后,再跳到的下一节点。

BFS需要用到队列,具体的可以由题目的情况而定;(一般用来解决,给定位置需要你找出到达位置的最短距离)

在对列的使用中,队列提供了一个位置使得在几个方向的前进得以同时进行,也就是说我么在检索的时候,由于我们同时开花,因此在到达我们设定的跳出的条件时,我们就能能够得到最优的那一条路径

模板:

  • 找到BFS的father(父节点);
  • 弄清楚下一子节点的个数(决定你的循环次数);
  • 移动父节点(该变后的父节点做子节点,子节点又做下一节点的父节点);
  • 判断子节点是否满足条件,是——压栈,移动此节点;否——不执行;
  • 最后输出;

要注意的点如下

  • 使用队列,每次执行后,须将队列的首元素删除,这样才可不断的遍历下去;
  • 一般设置两个数组(有时也可一个数组即可)一个char 的Game_map存放地图;一个int的record_way记录当前路线所走过的位置(其他的路线人可以走这个地方);
  • 判断条件一定要清晰且完全;
  • 全局变量的设置和使用,全局变量在完成一次执行时,必需重置或释放;
  • 在每一步的执行时,生一个新的变量继承和改变原来的值。(记录是否走过的数组不只用1来记录,也可以用step来记录,这样还可以起到另外的作用);
  • step不叠加;

深度优先搜索(缩写DFS)是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

我们就需要用到函数去不断迭代,在这中请况下,我们就不能直接的得到最有的那一条路径,但一般用来寻找可达的地点(一般解决给定位置,能否达到的问题);

模板 :

  • 判断结束BFS的条件;
  • 移动节点,判断节点是否满足仅需执行的条件;
  • 满足——BFS(调用BFS()函数进行迭代)——不满足,减少step或出栈,同时消除标记;
      for(int k=0;k<8;k++)
        {
            x=i+dir[k][1];
            y=j+dir[k][0];
            if(map[x][y]==0&&x>0&&x<=p&&y>0&&y<=q)
            {
                dfs(x,y);
                step--;//如果不满足,则减去步数;
            }
        }
        map[i][j]=0;//消除标记;

要注意的点如下

  • 注意跳出的条件;
  • 全局变量的设置和使用,全局变量在完成一次执行时,必需重置或释放;
  • step为叠加的,不会产生新的来记录;
原文地址:https://www.cnblogs.com/7750-13/p/7236692.html