概述
《铁机》C语言回溯法
回 溯 算 法
学习重点:
理解回溯法的基本思想;
掌握回溯法解题的基本算法。
`
学习过程:
一、回溯法的基本思想
回溯法又称试探法。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。
回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
具体说,就是:在搜索(依次用各种方法一一去试探)的过程中,当在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。当某步无法前进,要退回前
最后
以上就是舒适眼睛为你收集整理的c语言回溯法难吗,剖析C语言回溯法.doc的全部内容,希望文章能够帮你解决c语言回溯法难吗,剖析C语言回溯法.doc所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复