高级启示者
一.搜索与回溯
搜索与回溯是计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,但是可以利用搜索与回溯的技术求解。
回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。
二.深度优先搜索框架
void Search(int k) {
if(到目的地) 输出解 //边界条件
else
for (i=1;i<=算符总数;i++) //枚举所有可能**
if (满足条件){ //约束条件
保存结果和状态
Search(k+1); //递归搜索
恢复保存结果之前的状态 //状态恢复
}
}
}
三.应用
1.迷宫问题
在一方形迷宫中有n*m个格子,
我们知道闯迷宫的人的初始坐标 (sx,sy) 以及目标出口 (tx,ty),
以及迷宫中若干障碍物的坐标。
每次我们可以向上、下、左、右的格子做一次移动,
让我们判断是否能够到达迷宫出口,
或者统计到达迷宫出口的方案数。
2.排列组合问题
从n个不同元素中任取m(m≤n)个元素,
按照一定的顺序排列起来,
叫做从n个不同元素中取出m个元素的一个排列。
当m=n时所有的排列情况叫全排列。
李宜和在2021-08-16 09:56:49追加了内容
乱复制的
修练者
广度优先搜索广度优先搜索BFS(Breadth+First+Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略。在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的。首先生成第一层结点,同时**目标结点是否在所生成的结点中,如果不在,则将所有的第一层结点逐一扩展,得到第二层结点,并**第二层结点是否包含目标结点,……,对层次为n+1的任一结点进行扩展之前,必须先考虑层次完层次为n的结点的每种可能的状态。因此,对于同一层结点来说,求解问题的价值是相同的,可以按任意顺序来扩展它们。通常采用的原则是先生成的结点先扩展。为了便于进行搜索,要设置一个表存储所有的结点。由于在广度优先搜索算法中,要满足先生成的结点先扩展的原则,所以存储结点的表一般采用队列这种数据结构。广度优先搜索算法的搜索步骤一般是:(1)从队列头取出一个结点,**它按照扩展规则是否能够扩展,如果能则产生一个新结点。(2)**新生成的结点,看它是否已在队列中存在,如果新结点已经在队列中出现过,就放弃这个结点,然后回到第(1)步。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。(3)**新结点是否目标结点。如果新结点是目标结点,则搜索成功,程序结束;若新结点不是目标结点,则回到第(1)步,再从队列头取出结点进行扩展。最终可能产生两种结果:找到目标结点,或扩展完所有结点而没有找到目标结点。如果目标结点存在于解答树的有限层上,广度优先搜索算法一定能保证找到一条通向它的最佳路径,因此广度优先搜索算法特别适用于只需求出最优解的问题。当问题需要给出解的路径,则要保存每个结点的来源,也就是它是从哪一个节点扩展来的。对于广度优先搜索算法来说,问题不同则状态结点的结构和结点扩展规则是不同的,但搜索的策略是相同的。对于不同的问题,用广度优先搜索法的算法基本上都是一样的。但表示问题状态的结点数据结构、新结点是否为目标结点和是否为重复结点的判断等方面则有所不同。对具体的问题需要进行具体分析,这些函数要根据具体问题进行编写。