• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

06月
12
算法
C#

深度寻路算法(DFS算法)

发表于 2021-06-12 • 字数统计 3961 • 被 1,182 人看爆

思路

步骤一:选择一个节点
步骤二:选择该节点的其中一个邻接节点进行访问
步骤三:选择该邻接节点的邻接节点进行访问,重复步骤一,步骤二,
步骤四:当该节点没有邻接节点,返回上一个节点,搜寻邻接节点进行访问,重复步骤一,二,三,否则重复步骤四
步骤五:所有节点都已访问过,即结束访问
简单说:选择一个节点一直访问下去,直到该节点没有邻接节点,再访问上一级节点,直到所有节点都已经访问

图示讲解

原始图

DFS1.png

步骤一:

选择一个节点1访问

DFS2.png

步骤二:

选择节点1的邻接节点访问2(默认从左到右,从上到下)

DFS3.png

步骤三:

选择邻接节点2的邻接节点4进行访问

DFS4.png

步骤四:

发现节点4没有邻接节点,返回上一级查找有没有访问的节点,找到节点3没有,即访问节点3

DFS5.png

节点3访问后,发现没有邻接节点,最后发现节点5没有访问,即访问节点5,所有节点都已访问,即结束访问

DFS6.png

核心代码


        /// <summary>
        /// 广度优先算法/BFS算法
        /// </summary>
        /// <param name="origin">开始节点</param>
        /// <param name="target">目标节点</param>
        /// <param name="passNodeList">路径列表</param>
        public static void Search(Node origin, Node target, ref List<Node> passNodeList)
        {
            //清除地图数据
            passNodeList.Clear();
            for(int i = 1; i < mapLength; i++)
            {
                for(int j = 0; j < mapWidth; j++)
                {
                    //是否访问过
                    if(!map[i, j].bVisit)
                    {
                        //没访问
                        BFSSearch(map[i, j], origin, target, ref passNodeList);
                        
                    }
                }
            }

            //保存路径
            Node currentNode = map[target.X, target.Y];
            while(currentNode.Value != origin.Value)
            {
                passNodeList.Add(currentNode);
                currentNode = currentNode.parent;
            }

            passNodeList.Add(origin);
        }

        /// <summary>
        /// 根据当前节点,检查自己的邻接节点
        /// </summary>
        /// <param name="currentNode">当前节点</param>
        /// <param name="origiNode">开始节点</param>
        /// <param name="target">目标节点</param>
        /// <param name="passNodeList">路径列表</param>
        private static void BFSSearch(Node currentNode, Node origiNode, Node target, ref List<Node> passNodeList)
        {
            //将当前节点加入到队列中
            Queue<Node> queue = new Queue<Node>();
            queue.Enqueue(currentNode);


            //当前节点
            while(queue.Count > 0)
            {
               //获取邻接节点
                Node head = queue.Dequeue();
                //检查邻接节点(上下左右)
                List<Node> neighbors = getNeighbor(head);
                for(int i = 0; i < neighbors.Count; i++)
                {
                    //没有访问才&&不是不可走的路径点
                    if(!neighbors[i].bVisit && neighbors[i].Value != NODE_BLOCK)
                    {
                        //标记节点为已经访问
                        neighbors[i].bVisit = true;
                        neighbors[i].parent = head;
                        queue.Enqueue(neighbors[i]);

                        //是目标节点,return
                        if(neighbors[i].Value == target.Value)
                        {
                            return;
                        }
                    }
                }
            }

        }


        /// <summary>
        /// 搜索邻接节点
        /// </summary>
        /// <param name="currentNode">当前节点</param>
        /// <returns></returns>
        private static List<Node> getNeighbor(Node currentNode)
        {
            List<Node> nodes = new List<Node>();
            int x = currentNode.X;
            int y = currentNode.Y;
            if(x - 1 >= 0)
            {
                //左边
                nodes.Add(map[x - 1, y]);
            }
            if(x + 1 >= 0 && x + 1 < mapLength)
            {
                //右边
                nodes.Add(map[x + 1, y]);
            }

            if(y - 1 >= 0)
            {
                //上边
                nodes.Add(map[x, y - 1]);
            }

            if(y + 1 >= 0 && y + 1 < mapWidth)
            {
                //下边                
                nodes.Add(map[x, y + 1]);
            }
            return nodes;
        }

完整代码

DFS完整代码

分享到:
使用BMFont制作字体
广度寻路算法(BFS算法)
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,084次看爆
  • JAVA_HOME环境配置问题 3,734次看爆
  • AssetBundle使用 3,503次看爆
  • VSCode配置C++开发环境 3,260次看爆
  • Lua反射 3,136次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图