首页 > 编程知识 正文

dfs算法使用哪种数据结构,dfs算法经典应用

时间:2023-05-04 19:56:38 阅读:156798 作者:3019

浅谈DFS算法DFS,深度搜索算法。 可用于NPC的自动检测。 当然BFS和A*可能很出色。 过程分析:寻优算法的动画演示

主要思路是通过For循环扫描所有可能的方向,在扫描的同时采用递归持续监测其坐标与邻居是否相通。 (个人解读)

让我们来分析一下:

1、使用For环——,寻找某点(以(1,1 )为例)、上下左右4个方向的邻居),即(0,1 )、(2,1 ) ) 1,0 )、1,2 )的4个点)。

2、针对周围4点,判断——是否畅通,即是否为a、是否为墙或b、是否为出局

用——标记此坐标,将(1,1 )作为该点的父节点,如果可以执行以下操作

如果——不通,放弃递归,记住该过程(后述),直接执行下一步骤

3、如果相通,以该点为中心进行第二点,判断周围是否相通。 (开始递归)

此时,步骤3开始递归,遍历所有可能的情况,直到邻居等于终点坐标,然后返回路径链表。 在步骤2中,保存父节点

查找邻居的代码:

privatestaticlistnodegetneighbor (node current node ) ) { ListNode nodes=new ListNode; //初始化变量int x=currentNode.X; int y=currentNode.Y; //由此可知方向的优先顺序为左、右、下、上if(x-1=0x-1maplengh ) nodes.add ) map[x-1,y] ); (if ) x1=0x1mapLengh ) nodes.add ) map[x1,y]; (if ) y-1=0y-1mapLengh ) nodes.add ) map[x,y-1]; (if ) y1=0y1mapwidth ) nodes.add ) map[x,y 1]; } return nodes; }

图解

每次遍历时,四个方向的邻居都会进行运算。

由于一级邻居1相通,所以继续以邻居1为中心遍历二级邻居;

二级邻居一般遍历三级邻居;

三级邻里1通、for1终了、三级邻里2通、for2终了、三级邻里3通、for3终了、三级邻里4通、四级邻里经历;

邻居1不通,for1结束,邻居2不通,邻居2结束,邻居3成为终点,返回链表。

————————————————————————————

四级邻居4在终点后也执行,但没有继续。

三级邻居3在终点后也出发。 因为上一个for结束后,需要按顺序运行这个for

二级邻居甚至被执行到一级邻居4,并最终退出DFS

————————————————————————————

因为每次通过时,都会执行以下代码。 即使只有一个邻居通过,也会增加4个for

新的for只有一个通,同样很多4个for

privatestaticvoiddfssearch (inti,int j,Node origin,Node target ) { map[i,j].bVisit=true; //现在标记为通过[i,j]点//获取邻居节点; listnode neighbors=get neighbor (map [ I,j]; for(intk=0; k neighbors.Count; k ()//对该点周围全部进行一次检测。 因为neighbors.Count=4,所以int x=neighbors[k].X; int y=neighbors[k].Y; //判断周围是否走过,是否是墙壁——第一个Node的默认值为false,所以在这里需要! bVisit if (! map[x,y].bVisitmap[x,y].Value!=node_block(//递归深度遍历; //先将标志位设为已访问的map[x,y].bVisit=true; map[x,y].parent=map[i,j]; dfssearch(x,y,origin,target ); //递归DFS开始,继续在当前位置开始,根据起点和终点使用DFS寻路}//结束标准,所有地图全部跑完,bVisit全部为真——! bVisit为false,结束}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。