8. 深度优先搜索

合集下载

深度优先搜索和广度优先搜索

深度优先搜索和广度优先搜索

二、 重排九宫问题游戏
在一个 3 乘 3 的九宫中有 1-8 的 8 个数及一个空格随机摆放在其中的格子里。如下面 左图所示。现在要求实现这样的问题:将该九宫调整为如下图右图所示的形式。调整规则是: 每次只能将与空格(上,下或左,右)相临的一个数字平移到空格中。试编程实现。
|2|8 |3|
|1|2|3|
from = f; to = t; distance = d; skip = false; } } class Depth { final int MAX = 100; // This array holds the flight information. FlightInfo flights[] = new FlightInfo[MAX]; int numFlights = 0; // number of entries in flight array Stack btStack = new Stack(); // backtrack stack public static void main(String args[]) {
下面是用深度优先搜索求解的程序:
// Find connections using a depth-first search. import java.util.*; import java.io.*; // Flight information. class FlightInfo {
String from; String to; int distance; boolean skip; // used in backtracking FlightInfo(String f, String t, int d) {
int dist; FlightInfo f; // See if at destination. dist = match(from, to); if(dist != 0) {

“八”数码问题的宽度优先搜索与深度优先搜索

“八”数码问题的宽度优先搜索与深度优先搜索

“八”数码问题的宽度优先搜索与深度优先搜索我在观看视频和查看大学课本及网上搜索等资料才对“八”数码问题有了更进一步的了解和认识。

一、“八”数码问题的宽度优先搜索步骤如下:1、判断初始节点是否为目标节点,若初始节点是目标节点则搜索过程结束;若不是则转到第2步;2、由初始节点向第1层扩展,得到3个节点:2、3、4;得到一个节点即判断该节点是否为目标节点,若是则搜索过程结束;若2、3、4节点均不是目标节点则转到第3步;3、从第1层的第1个节点向第2层扩展,得到节点5;从第1层的第2个节点向第2层扩展,得到3个节点:6、7、8;从第1层的第3个节点向第2层扩展得到节点9;得到一个节点即判断该节点是否为目标节点,若是则搜索过程结束;若6、7、8、9节点均不是目标节点则转到第4步;4、按照上述方法对下一层的节点进行扩展,搜索目标节点;直至搜索到目标节点为止。

二、“八”数码问题的深度优先搜索步骤如下:1、设置深度界限,假设为5;2、判断初始节点是否为目标节点,若初始节点是目标节点则搜索过程结束;若不是则转到第2步;3、由初始节点向第1层扩展,得到节点2,判断节点2是否为目标节点;若是则搜索过程结束;若不是,则将节点2向第2层扩展,得到节点3;4、判断节点3是否为目标节点,若是则搜索过程结束;若不是则将节点3向第3层扩展,得到节点4;5、判断节点4是否为目标节点,若是则搜索过程结束;若不是则将节点4向第4层扩展,得到节点5;6、判断节点5是否为目标节点,若是则搜索过程结束;若不是则结束此轮搜索,返回到第2层,将节点3向第3层扩展得到节点6;7、判断节点6是否为目标节点,若是则搜索过程结束;若不是则将节点6向第4层扩展,得到节点7;8、判断节点7是否为目标节点,若是则结束搜索过程;若不是则将节点6向第4层扩展得到节点8;9、依次类推,知道得到目标节点为止。

三、上述两种搜索策略的比较在宽度优先搜索过程中,扩展到第26个节点时找到了目标节点;而在深度优先搜索过程中,扩展到第18个节点时得到了目标节点。

深度优先搜索和广度优先搜索

深度优先搜索和广度优先搜索

深度优先搜索和广度优先搜索一、深度优先搜索和广度优先搜索的深入讨论(一)深度优先搜索的特点是无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求。

(2)深度优先搜索法有递归以及非递归两种设计方法。

一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。

当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。

(3)深度优先搜索方法有广义和狭义两种理解。

广义的理解是,只要最新产生的结点(即深度最大的结点)先进行扩展的方法,就称为深度优先搜索方法。

在这种理解情况下,深度优先搜索算法有全部保留和不全部保留产生的结点的两种情况。

而狭义的理解是,仅仅只保留全部产生结点的算法。

本书取前一种广义的理解。

不保留全部结点的算法属于一般的回溯算法范畴。

保留全部结点的算法,实际上是在数据库中产生一个结点之间的搜索树,因此也属于图搜索算法的范畴。

(4)不保留全部结点的深度优先搜索法,由于把扩展望的结点从数据库中弹出删除,这样,一般在数据库中存储的结点数就是深度值,因此它占用的空间较少,所以,当搜索树的结点较多,用其他方法易产生内存溢出时,深度优先搜索不失为一种有效的算法。

(5)从输出结果可看出,深度优先搜索找到的第一个解并不一定是最优解.如果要求出最优解的话,一种方法将是后面要介绍的动态规划法,另一种方法是修改原算法:把原输出过程的地方改为记录过程,即记录达到当前目标的路径和相应的路程值,并与前面已记录的值进行比较,保留其中最优的,等全部搜索完成后,才把保留的最优解输出。

二、广度优先搜索法的显著特点是:(1)在产生新的子结点时,深度越小的结点越先得到扩展,即先产生它的子结点。

为使算法便于实现,存放结点的数据库一般用队列的结构。

“八”数码问题的宽度优先搜索与深度优先搜索

“八”数码问题的宽度优先搜索与深度优先搜索

“八”数码问题的宽度优先搜索与深度优先搜索我在观看视频和查看大学课本及网上搜索等资料才对“八”数码问题有了更进一步的了解和认识。

一、“八”数码问题的宽度优先搜索步骤如下:1、判断初始节点是否为目标节点,若初始节点是目标节点则搜索过程结束;若不是则转到第2步;2、由初始节点向第1层扩展,得到3个节点:2、3、4;得到一个节点即判断该节点是否为目标节点,若是则搜索过程结束;若2、3、4节点均不是目标节点则转到第3步;3、从第1层的第1个节点向第2层扩展,得到节点5;从第1层的第2个节点向第2层扩展,得到3个节点:6、7、8;从第1层的第3个节点向第2层扩展得到节点9;得到一个节点即判断该节点是否为目标节点,若是则搜索过程结束;若6、7、8、9节点均不是目标节点则转到第4步;4、按照上述方法对下一层的节点进行扩展,搜索目标节点;直至搜索到目标节点为止。

二、“八”数码问题的深度优先搜索步骤如下:1、设置深度界限,假设为5;2、判断初始节点是否为目标节点,若初始节点是目标节点则搜索过程结束;若不是则转到第2步;3、由初始节点向第1层扩展,得到节点2,判断节点2是否为目标节点;若是则搜索过程结束;若不是,则将节点2向第2层扩展,得到节点3;4、判断节点3是否为目标节点,若是则搜索过程结束;若不是则将节点3向第3层扩展,得到节点4;5、判断节点4是否为目标节点,若是则搜索过程结束;若不是则将节点4向第4层扩展,得到节点5;6、判断节点5是否为目标节点,若是则搜索过程结束;若不是则结束此轮搜索,返回到第2层,将节点3向第3层扩展得到节点6;7、判断节点6是否为目标节点,若是则搜索过程结束;若不是则将节点6向第4层扩展,得到节点7;8、判断节点7是否为目标节点,若是则结束搜索过程;若不是则将节点6向第4层扩展得到节点8;9、依次类推,知道得到目标节点为止。

三、上述两种搜索策略的比较在宽度优先搜索过程中,扩展到第26个节点时找到了目标节点;而在深度优先搜索过程中,扩展到第18个节点时得到了目标节点。

深度优先搜索算法

深度优先搜索算法

深度优先搜索算法(DFS)是一种常用的图算法,该算法主要用于解决有解路径或遍历某个图结构的问题。

的主要思路是从某个图的起始点出发,访问邻居节点,直到该节点没有未被访问的邻居节点为止,然后回溯到上一个节点继续遍历其他未被访问的邻居节点。

该算法的基本流程可以概括为以下几个步骤:1. 从某个图结构的起始点开始进行深度优先搜索。

2. 如果该节点没有未被访问的邻居节点,则回溯到上一个节点。

3. 继续遍历其他未被访问的邻居节点,直到所有的节点已被访问。

4. 搜索结束。

的实现可以使用递归或栈数据结构进行。

使用递归实现时,程序会自动保存每个节点的访问状态,无需手动进行处理。

使用栈数据结构实现时,需要手动保存每个节点的访问状态,以便在回溯时继续遍历其他未被访问的邻居节点。

主要应用于解决以下问题:1. 找出两点之间的最短路径可以用来查找两个节点之间的最短路径。

在进行深度优先搜索时,需要记录每个节点的前驱节点,以便在搜索结束后构造最短路径。

2. 遍历一张图结构可以用来遍历一张图结构。

在进行深度优先搜索时,可以将图中的所有节点都进行遍历。

3. 解决迷宫问题可以用来解决迷宫问题。

在进行深度优先搜索时,需要记录每个走过的位置,以便在搜索结束后构造出从起点到终点的路径。

4. 生成所有排列或组合可以用来生成所有排列或组合。

在进行深度优先搜索时,需要记录已经访问过的节点,以便在搜索结束后生成所有满足条件的排列或组合。

存在一些问题,例如搜索过程中容易陷入死循环、需要记录每个节点的访问状态等。

为了解决这些问题,可以使用剪枝、双向搜索等技术来优化搜索算法。

总之,是一种常用的图算法,该算法主要用于解决有解路径或遍历某个图结构的问题。

的主要思路是从某个图的起始点出发, 访问邻居节点,直到该节点没有未被访问的邻居节点为止,然后回溯到上一个节点继续遍历其他未被访问的邻居节点。

在实际应用中,可以用来查找两个节点之间的最短路径、遍历一张图结构、解决迷宫问题、生成所有排列或组合等。

深度优先搜索算法详解及代码实现

深度优先搜索算法详解及代码实现

深度优先搜索算法详解及代码实现深度优先搜索(Depth-First Search,DFS)是一种常见的图遍历算法,用于遍历或搜索图或树的所有节点。

它的核心思想是从起始节点开始,沿着一条路径尽可能深入地访问其他节点,直到无法继续深入为止,然后回退到上一个节点,继续搜索未访问过的节点,直到所有节点都被访问为止。

一、算法原理深度优先搜索算法是通过递归或使用栈(Stack)的数据结构来实现的。

下面是深度优先搜索算法的详细步骤:1. 选择起始节点,并标记该节点为已访问。

2. 从起始节点出发,依次访问与当前节点相邻且未被访问的节点。

3. 若当前节点有未被访问的邻居节点,则选择其中一个节点,将其标记为已访问,并将当前节点入栈。

4. 重复步骤2和3,直到当前节点没有未被访问的邻居节点。

5. 若当前节点没有未被访问的邻居节点,则从栈中弹出一个节点作为当前节点。

6. 重复步骤2至5,直到栈为空。

深度优先搜索算法会不断地深入到图或树的某一分支直到底部,然后再回退到上层节点继续搜索其他分支。

因此,它的搜索路径类似于一条深入的迷宫路径,直到没有其他路径可走后,再原路返回。

二、代码实现以下是使用递归方式实现深度优先搜索算法的代码:```pythondef dfs(graph, start, visited):visited.add(start)print(start, end=" ")for neighbor in graph[start]:if neighbor not in visited:dfs(graph, neighbor, visited)# 示例数据graph = {'A': ['B', 'C'],'B': ['A', 'D', 'E'],'C': ['A', 'F'],'D': ['B'],'E': ['B', 'F'],'F': ['C', 'E']}start_node = 'A'visited = set()dfs(graph, start_node, visited)```上述代码首先定义了一个用于实现深度优先搜索的辅助函数`dfs`。

原题目:描述深度优先搜索算法的过程。

原题目:描述深度优先搜索算法的过程。

原题目:描述深度优先搜索算法的过程。

描述深度优先搜索算法的过程深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索图的算法,它是一种递归算法,通过深度的方式探索图的节点以获得解决方案。

步骤使用深度优先搜索算法来遍历图的节点的步骤如下:1. 选择一个起始节点作为当前节点,并将其标记为已访问。

2. 检查当前节点是否是目标节点。

如果是目标节点,则算法结束。

3. 如果当前节点不是目标节点,则遍历当前节点的邻居节点。

4. 对于每个未访问的邻居节点,将其标记为已访问,并将其加入到待访问节点的列表中。

5. 从待访问节点的列表中选择一个节点作为新的当前节点,并重复步骤2-4,直到找到目标节点或所有节点都被访问。

6. 如果所有节点都被访问但没有找到目标节点,则算法结束。

递归实现深度优先搜索算法可以使用递归的方式来实现。

以下是一个递归实现深度优先搜索的示例代码:def dfs(graph, node, visited):visited.add(node)print(node)for neighbor in graph[node]:if neighbor not in visited:dfs(graph, neighbor, visited)在上述代码中,`graph` 是表示图的邻接表,`node` 是当前节点,`visited` 是已访问节点的集合。

算法以起始节点作为参数进行递归调用,并在访问每个节点时打印节点的值。

非递归实现除了递归方式,深度优先搜索算法还可以使用栈来实现非递归版本。

以下是一个非递归实现深度优先搜索的示例代码:def dfs(graph, start_node):visited = set()stack = [start_node]while stack:node = stack.pop()if node not in visited:visited.add(node)print(node)for neighbor in graph[node]:if neighbor not in visited:stack.append(neighbor)在上述代码中,`graph` 是表示图的邻接表,`start_node` 是起始节点。

广度优先搜索和深度优先搜索

广度优先搜索和深度优先搜索

有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。

它们最终都会到达所有连通的顶点。

深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。

深度优先搜索:深度优先搜索就是在搜索树的每一层始终先只扩展一个子节点,不断地向纵深前进直到不能再前进(到达叶子节点或受到深度限制)时,才从当前节点返回到上一级节点,沿另一方向又继续前进。

这种方法的搜索树是从树根开始一枝一枝逐渐形成的。

下面图中的数字显示了深度优先搜索顶点被访问的顺序。

为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则:(1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。

(2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。

(3) 如果不能执行规则1和规则2,就完成了整个搜索过程。

广度优先搜索:在深度优先搜索算法中,是深度越大的结点越先得到扩展。

如果在搜索中把算法改为按结点的层次进行搜索,本层的结点没有搜索处理完时,不能对下层结点进行处理,即深度越小的结点越先得到扩展,也就是说先产生的结点先得以扩展处理,这种搜索算法称为广度优先搜索法。

在深度优先搜索中,算法表现得好像要尽快地远离起始点似的。

相反,在广度优先搜索中,算法好像要尽可能地靠近起始点。

它首先访问起始顶点的所有邻接点,然后再访问较远的区域。

它是用队列来实现的。

下面图中的数字显示了广度优先搜索顶点被访问的顺序。

实现广度优先搜索,也要遵守三个规则:(1) 访问下一个未来访问的邻接点,这个顶点必须是当前顶点的邻接点,标记它,并把它插入到队列中。

(2) 如果因为已经没有未访问顶点而不能执行规则1时,那么从队列头取一个顶点,并使其成为当前顶点。

(3) 如果因为队列为空而不能执行规则2,则搜索结束。

BFS是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。

换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。

BFS并不使用经验法则算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3/31
• 然而要实现这样的算法,我们需要用到编程的一大利器--然而要实现这样的算法,我们需要用到编程的一大利器 递归。 递归。 • 讲一个更具体的例子:从前有座山,山里有座庙,庙里有 讲一个更具体的例子:从前有座山,山里有座庙, 个老和尚,老和尚在讲故事,讲什么呢? 从前有座山, 个老和尚,老和尚在讲故事,讲什么呢?讲:从前有座山, 山里有座庙,庙里有个老和尚,老和尚在讲故事, 山里有座庙,庙里有个老和尚,老和尚在讲故事,讲什么 从前有座山,山里有座庙,庙里有个老和尚, 呢?讲:从前有座山,山里有座庙,庙里有个老和尚,老 和尚在讲故事,讲什么呢? 和尚在讲故事,讲什么呢?讲:…………。好家伙,这样 。好家伙, 讲到世界末日还讲不玩, 讲到世界末日还讲不玩,老和尚讲的故事实际上就是前面 的故事情节,这样不断地调用程序本身,就形成了递归。 的故事情节,这样不断地调用程序本身,就形成了递归。 万一这个故事中的某一个老和尚看这个故事不顺眼, 万一这个故事中的某一个老和尚看这个故事不顺眼,就把 他要讲的故事换成: 你有完没完啊! 这样, 他要讲的故事换成:“你有完没完啊!”,这样,整个故 事也就嘎然而止了。 事也就嘎然而止了。 • 我们编程就要注意这一点,在适当的时候,就必须要有一 我们编程就要注意这一点,在适当的时候, 个这样的和尚挺身而出,把整个故事给停下来, 个这样的和尚挺身而出,把整个故事给停下来,或者说他 不再往深一层次搜索,要不, 不再往深一层次搜索,要不,我们的递归就会因计算机栈 空间大小的限制而溢出,称为stack overflow。 空间大小的限制而溢出,称为 。
7/31
水仙花数
• 一个三位数abc如果满足abc = a^3 + b^3 + c^3 那 么就把这个数叫做水仙花数。 • 如果一个N位数所有数码的N次方的和加起来等于 这个数字本身,我们把这样的数叫做广义水仙花 数,容易看出来N = 3是广义水仙花数。 • 现在,我们的任务是,输入一个m (m < 7) ,让你 求出所有满足N = m的广义水仙花数。 • 3 (153 370 371 407) • 5 (54748 92727 93084)
2/31
迷宫问题
• 首先我们来想象一只老鼠,在一座不见天日的迷 首先我们来想象一只老鼠, 宫内,老鼠在入口处进去,要从出口出来。 宫内,老鼠在入口处进去,要从出口出来。那老 鼠会怎么走?当然可以是这样的: 鼠会怎么走?当然可以是这样的:老鼠如果遇到 直路,就一直往前走,如果遇到分叉路口, 直路,就一直往前走,如果遇到分叉路口,就任 意选择其中的一条继续往下走,如果遇到死胡同, 意选择其中的一条继续往下走,如果遇到死胡同, 就退回到最近的一个分叉路口, 就退回到最近的一个分叉路口,选择另一条道路 再走下去,如果遇到了出口, 再走下去,如果遇到了出口,老鼠的旅途就算成 功结束了。 功结束了。 • 深度优先搜索的基本原则:按照某种条件往前试 深度优先搜索的基本原则: 探搜索,如果前进中遭到失败( 探搜索,如果前进中遭到失败(正如老鼠遇到死 胡同)则退回头另选通路继续搜索, 胡同)则退回头另选通路继续搜索,直到找到满 足条件的目标为止。 足条件的目标为止。
15/31
• Input
第一行为1个整数 ,表示有T组测试数据 第一行为 个整数T,表示有 组测试数据 个整数 第二行为4个整数 个整数Height, Width, MinLen,MaxLen,分别表示 第二行为 个整数 , 地图的高, 命令序列的最小和最大长度。 地图的高,宽,命令序列的最小和最大长度。3 <= Height, Width <= 60, 2 <= MinLen <= MaxLen <= 35 第三行至第Height+2行为地图信息。其中 表示空地,'X'表示 行为地图信息。 表示空地, 表示 第三行至第 行为地图信息 其中'.'表示空地 陷阱。 陷阱。
12/31
int main() { while (scanf("%d", &m), m) { dfs(1, 0, 0); } return 0; }
13/31
深度优先搜索解决问题的框架
void dfs(int deep, State curState) { if (deep > Max) //深度达到极限 深度达到极限 { if (curState == target) //找到目标 找到目标 { //... } } else { for (i = 1; i <= totalExpandMethod; i++) { dfs(deep + 1, expandMethod(curState, i)); } } }
ACM算法与程序设计 ACM算法与程序设计
第七讲
搜索专题
深度优先(DFS) 深度优先(DFS)
深度优先搜索算法( 深度优先搜索算法(Depth-First-Search) )
• DFS是由获得计算机领域的最高奖 图灵奖的霍普克洛夫特 是由获得计算机领域的最高奖-图灵奖的霍普克洛夫特 是由获得计算机领域的最高奖 与陶尔扬发明 • DFS是搜索算法的一种。是沿着树的深度遍历树的节点, 是搜索算法的一种。 是搜索算法的一种 是沿着树的深度遍历树的节点, 尽可能深的搜索树的分支。当节点v的所有边都己被探寻 尽可能深的搜索树的分支。当节点 的所有边都己被探寻 搜索将回溯到发现节点v的那条边的起始节点 的那条边的起始节点。 过,搜索将回溯到发现节点 的那条边的起始节点。这一 过程一直进行到已发现从源节点可达的所有节点为止。 过程一直进行到已发现从源节点可达的所有节点为止。如 果还存在未被发现的节点, 果还存在未被发现的节点,则选择其中一个作为源节点并 重复以上过程, 重复以上过程,整个进程反复进行直到所有节点都被访问 为止。属于盲目搜索。 为止。属于盲目搜索。 • DFS的时间复杂度不高(为线性时间复杂度),遍历图的 的时间复杂度不高( ),遍历图的 的时间复杂度不高 为线性时间复杂度), 效率往往非常高。因此, 效率往往非常高。因此,鉴于深度优先搜索算法的强大功 能以及高效性往往被研究图论问题的专家所推崇。 能以及高效性往往被研究图论问题的专家所推崇。 • 时间复杂度:O( b m );空间复杂度:O(bm);b - 分支系数 时间复杂度: ;空间复杂度: ; m - 图的最大深度
10/31
#include <iostream> #include <cstdio> using namespace std; int m; int Pow(int x, int n) { int res = 1; while (n--) res *= x; return res; }
11/31
void dfs(int deep, int curNum, int curSum) { if (deep > m) //类似于 类似于base case 类似于 { if (curNum == curSum) printf("%d\n", curNum); } else if (deep <= m) { int start = (deep == 1); //第一位不为 第一位不为0 第一位不为 for (int i = start; i <= 9; i++) dfs(deep + 1, curNum * 10 + i, curSum + Pow(i, m)); //缩小问题规模 缩小问题规模 } }
14/31
大逃亡
/ShowProblem.aspx?ProblemID=1022
• Description
love8909遇到危险了!!!他被困在一个迷宫中,彷徨而无助。 遇到危险了!!!他被困在一个迷宫中,彷徨而无助。 遇到危险了!!!他被困在一个迷宫中 现在需要你来帮助他走出困境。他只能记住指定长度的指令(指 现在需要你来帮助他走出困境。他只能记住指定长度的指令 指 令的长度由MinLen和MaxLen限定 ,并循环执行,而且他只会 限定), 令的长度由 和 限定 并循环执行, 向下或向右(很奇怪吧^_^)。他在地图的左上角,你需要告 )。他在地图的左上角 向下或向右(很奇怪吧 )。他在地图的左上角, 诉他一个运动序列,即向下( )或向右( ), ),使他能够成功 诉他一个运动序列,即向下(D)或向右(R),使他能够成功 走出这个图且不碰到陷阱。 如果还不明白,可以参看图片。 走出这个图且不碰到陷阱。 如果还不明白,可以参看图片。 图片1, 对应样例的第 对应样例的第1组 图片3对应样例的第 对应样例的第2组 图片 ,2对应样例的第 组,图片 对应样例的第 组。
8/31
• 方法:数据规模很小,可以直接枚举 方法:数据规模很小, 所有情况,然后判断是否满足条件。 所有情况,然后判断是否满足条件。 • 难点:循环层数不确定 难点: • 怎么实现这个 重循环? 怎么实现这个m重循环 重循环? • 答案:递归。 答案:递归。
9/31
m重循环的实现: 重循环的实现: 重循环的实现 void dfs(int deep) { if (deep > m) { //check answer } else if (deep <= m) { for (i = 1; i <= n; i++) dfs(deep + 1); } }
5/31
Boolean visited[MAX]; Status (*VisitFunc)(int v); //VisitFunc() 为顶点的访问函数。 为顶点的访问函数。 void DFSTraverse(graph G,Status(*Visit)(int v)){ VisitFunc = Visit ; for( v=0;v<G.vexnum;++v) visited[v] = FALSE; for ( v=0;v<G.vexnum;++v) if( !visited[v]) DFS(G,v); } void DFS(Graph G, int v) { visited[v] = TRUE ; VisitFunc(G.vertices[v].data ); for(w=FirstAdjvex(G,v);w;w=NextAdjvex(G,v,w)) if( !visited[w]) DFS(G,w);}
相关文档
最新文档