回溯算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
回溯算法
学习重点:
1、理解回溯法的基本思想;
2、掌握回溯法解题的基本算法。
`
学习过程:
一、回溯法的基本思想
回溯法又称试探法。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
具体说,就是:在搜索(依次用各种方法一一去试探)的过程中,当在P点有N种选择,则从第一种开始尝试,若第K种可行,即这一步搜索成功,打上标记,再向前(即 P+1点)搜索;如在P 点搜索失败(所有的方法都试探过,没有一种可行),为了摆脱当前的失败,就返回搜索进程中的上一点(即P-1点),再用第K+1种方法(假设上次在P-1点用第K种方法搜索成功,必须明确以前用过的方法不能再用,否则会陷入死循环)再去搜索,重新寻求解答。这样搜索回溯,再搜索再回溯,如能搜索到终点,问题有解,如最后回溯到出发点,问题就无解。
这种在搜索的过程中,先对深度大的点进行扩展的算法,叫深度优先搜索法。
设搜索深度指针为P,搜索方法指针为I,可把深度优先搜索算法写成如下形式:
P=0:I=0
DO
I=I+1(搜索到一种方法)
IF 搜索方法有效 THEN
试探产生临时新结点
IF 符合条件 THEN
P=P+1(深入一步),新结点记录,I=0,再全方位搜索
IF到达终点 THEN 结束搜索,输出结果
END IF
ELSE(搜索的方法无效)
I=上次搜索的方法(下一轮将用I的下一方法去搜索),P=P-1(后退一步返回上结点) END IF
L00P UNTIL P=0
IF P=0 THEN ’深度指针P为0,表示已退到起始状态,是本题无解的标志无解
ELSE
输出结果
END IF
END
二、应用举例
1、【问题描述】有一迷宫(如图),可用一个10行9列的0~1矩阵表示,其中0表示无障碍(白色),
1表示有障碍(黑色)。设入口位置的坐标为(2,1),出口为(9,9),规定每次移动中只能从一个无障碍的单元移到其周围四个方向上任一无障碍的单元。试编程给出通过迷宫的一条路径或报告一个“无法通过”的信息。
入口
出口
【问题分析】
要寻找一条通过迷宫的路径,通常用深度优先搜索。当在迷宫入口,先确定某个前进走向,
依此一一试探,如某一走向有路可走,就前进一步,继续向前试探;如果无路可走,则退回一步,重新选择未走过的方向再去试探可前进的路。进进退退,再进进再退退,按此规则不断搜索,直
至搜索到出口,闯迷宫成功。如最后退回入口,则此迷宫是个死胡同。
在搜索迷宫时,为了不迷失方向和不走重复的路,在搜索时必须在前进与回退的路上设置一
些标记,这样,就可以判断哪条路是已经走过的,哪条路是死胡同,哪条路还没有走过。根据这
些标记,就能正确的找到通向出口的路,在回溯时也能正确地找到应返回的位置,避免重新进入
死胡同。
【数据结构分析】
⑴建立一个相应的迷宫数组A(10,9),再根据迷宫的0~1矩阵(不同的迷宫有不同的矩阵数
据),给数组的每一个元素赋予相应的值,如用X 、Y 表示迷宫中的位置坐标,则:
A(X ,Y)=0表示此处可走(白色)
A(X ,Y)=l 表示此处是路不通(黑色)
A(X ,Y)=2表示此处已走过
如果可走的位置已走过,就使原来的A(X ,Y)=0改为A(X ,Y)=2,这一点很重要,保证不陷
入死循环(避免重复走某一步)。前面的两个图中后图就是前图的数学模型。
⑵设I 为搜索走向指针,I 的取值范围1~4(1向右、2向下、3向左、4向上),这四个走向
用一个数组V(4,2)来表示。第一个下标是I 表示某个走向;第二个下标,1表示行增量(向下为
正,向上为负),2表示列增量(向右为正,向左为负)。四个走向的下标及其增量如下图所示。
⑶变量P 为深度指针,前进一步P=P+1,后退一步P=P-1,走了多少步,P 值就多大。
⑷建立X 和Y 数组,存放已行走路线中各步的X 和Y 值,因不知走多少步才能走出迷宫,所
以这两个数组可以定义大一些;如:DIM X(100),Y(100),表示走的第P 步,则X(P)=X ,Y(P)=Y 。当某步无法前进,要退回前一步,前一步的位置X 、Y 值就可以从这两个数组中取出。最后输出两
个数组的值,就是走出迷宫的路线。
⑸建立S 数组,用它来存放已走路线中各步搜索走向的I 值。当在P 步搜索前进用I 走向,
则S(P)=I 。当某步无法前进,要退回前一步,继续再向前搜索时,I 的值不能再从1开始去试探,向右:V(1,1)=0,V(1,2)=1 即行没变,列加1 向上:V(4,1)=-1,V(4,2)=0 即行减1,列没变 向左:V(3,1)=0,V(3,2)=-1 即行没变,列减1
向下:V(2,1)=1,V(2,2)=0 即行加1,列没变
而应该从S(P)中取出 I值,从I+1开始去试探;这一点很重要,否则也会陷入死循环。举例说明:假如在第7步前进时,试探向前(向右即I=1)不行;换向下(I=2)可行,记下S(7)=2,就继续前进到第8步。如在第8步搜索前进四个走向都不行(死胡同),只有再回到第7步,在第7步应该用I=2+1=3的方向去搜索,因为前两种方向已试探失败,不能再用。
⑹迷宫的入口值为XO、Y0,迷宫的出口值为XE、YE
【程序清单】
CLS
DATA 1,1,1,1,1,1,1,1,1
DATA 0,0,0,0,0,0,0,0,1
DATA 1,0,1,0,0,1,1,0,1
DATA 1,0,0,1,0,1,0,0,1
DATA 1,1,0,1,0,0,1,0,1
DATA 1,0,0,0,1,0,1,0,1
DATA 1,0,1,1,0,0,1,0,1
DATA 1,0,0,0,1,1,0,1,1
DATA 1,0,1,0,0,0,0,0,0
DATA 1,1,1,1,1,1,1,1,1
X=10 :Y=9 ‘迷宫大小
DIM A(10,9),S(100),X(100),Y(100) ‘A是迷宫,S存放每步方向,X、Y存放每步的坐标
XE=9 : YE=9
FOR I=1 TO X ‘读入迷宫矩阵
FOR J=1 TO Y
READ A(I,J)
NEXT J,I
FOR I=1 TO 4 ‘四个方向的增量,1向右、2向下、3向左、4向上
READ V(I,1),V(I,2)
NEXT I
DATA 0,1,1,0,0,-1,-1,0
X0=2 : Y0=1: P=0: X(P)=X0 : Y(P)=Y0: I=0 ‘入口坐标(2,1),起点算第0步
DO
I=I+1
IF I<=4 THEN
X=X(P)+V(I,1) :Y=Y(P)+V(I,2)
IF A(X,Y)=0 THEN ‘通
P=P+1: S(P)=I: X(P)=X: Y(P)=Y ‘记录此步的方向、坐标
A(X,Y)=2 ‘打上标记,表示此点已走过
I=0 ‘下一步又将从1号方向开始尝试
END IF