回溯法的应用(实验报告)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华南师范大学本科生实验报告
姓名_张俊发_学号***********
院系_计算机学院_专业_计算机科学与技术_年级2008级班级_2班_
小组实验任务分工_独立完成
实验时间2010 年_6_月 1 _日
实验名称回溯法的应用
指导老师及职称陈振洲
华南师范大学教务处编印
实验课程:算法分析与设计
实验名称:回溯法的应用(综设型实验)
第一部分实验内容
1.实验目标
(1)熟悉使用回溯法求解问题的基本思路。
(2)掌握回溯算法的程序实现方法。
(3)理解回溯算法的特点。
2. 实验任务
(1)从所给定的题目中选择一题,使用回溯法求解之。
(2)用文字来描述你的算法思路,包括解空间、限界函数、算法主要步骤等。(3)在Windows环境下使用C/C++语言编程实现算法。
(4)记录运行结果,包括输入数据,问题解答及运行时间。
(5)分析算法最坏情况下时间复杂度和空间复杂度。
(6)谈谈实验后的感想,包括关于该问题或类似问题的求解算法的建议。3. 实验设备及环境
PC;C/C++等编程语言。
4. 实验主要步骤
(1)根据实验目标,明确实验的具体任务;
(2)设计求解问题的回溯算法,并编写程序实现算法;
(3)设计实验数据并运行程序、记录运行的结果;
(4)分析算法时空性能;
(5)实验后的心得体会。
第二部分问题及算法
1.问题描述
国际象棋的棋盘上有八八六十四个格子(这里简化为5*6=30个格子), 黑白相间, 棋子放在格子中. 棋中的马走“日”字, 即横二竖一, 或横一竖二. 马从棋盘的某个格子出发, 走29 步, 是否能走过其他29 个格子各一次? 如果能够, 则说存在一条马的周游路线. 如果马从某个格子出发, 不重复地走过了其余29个格子, 第30 步又回到了出发点, 则说存在一条马的周游闭路.
按照从上到下,从左到右对棋盘的方格编号,如下所示:
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
马的走法是“日”字形路线,例如当马在位置15的时候,它可以到达2、4、7、11、
19、23、26和28。但是规定马是不能跳出棋盘外的,例如从位置1只能到达9和14。
2. 回溯法的一般思路
对于用回溯法求解的问题,首先要将问题进行适当的转化,得出状态空间树。这棵树的每条完整路径都代表了一种解的可能。通过深度优先搜索这棵树,枚举每种可能的解的情况;从而得出结果。
回溯法中,首先需要明确下面三个概念:
(一)约束函数:约束函数是根据题意定出的。通过描述合法解的一般特征用于去除不合法的解,从而避免继续搜索出这个不合法解的剩余部分。因此,约束函数是对于任何状态空间树上的节点都有效、等价的。
(二)状态空间树:刚刚已经提到,状态空间树是一个对所有解的图形描述。树上的每个子节点的解都只有一个部分与父节点不同。
(三)扩展节点、活结点、死结点:所谓扩展节点,就是当前正在求出它的子节点的节点,在DFS中,只允许有一个扩展节点。活结点就是通过与约束函数的对照,节点本身和其父节点均满足约束函数要求的节点;死结点反之。由此很容易知道死结点是不必求出其子节点的(没有意义)。
2.求解问题的回溯算法描述
Backtrack(x,y,dep);
(1)棋盘board[5][6]每个点初始化为0,输入起始点的坐标x,y,棋盘起始点board[x][y]赋值为1,保存起始点坐标为xstart,ystart,步数dep赋值为1。
(2)每个点从八个方向去试探,若全部试完则转(7)。
(3)通过约束函数check(x,y)检查这一步是否还在棋盘内,不是则转(2)。
(4)试探成功则,步数+1,board[x][y]=dep,前进一步再试探即递归调用Backtrack(x,y,dep);
(5)正确解(步数等于30,下一步可以回到起始点)还未找到则转(2)。
(6)已找到一种解则记录并打印。
(7)退回一步(回溯),若未退到头则转(2)。
(8)已退到头则结束或打印无解。
3.算法实现的关键技巧
棋中的马走“日”字, 即横二竖一, 或横一竖二,在每个点都有八个方向可以走,用一个二维数组dir[8][2]={-1,-2,1,-2,2,-1,2,1,1,2,-1,2,-2,1,-2,-1}表示八个方向,则下一步可表示为x=x+dir[i][0],y=y+dir[i][1](0<=i<8)。遍历每个方向时要用约束函数chack(x,y)检查点是否合法,即0<=x<5,0<=y<6。
第三部分实验结果与分析
1.实验数据及结果
1 18 7 2
2
3 16
8 27 2 17 12 23
19 30 21 6 15 4
26 9 28 13 24 11
29 20 25 10 5 14
21 12 17 2 27 6
18 1 20 5 16 3
11 22 13 28 7 26
30 19 24 9 4 15
23 10 29 14 25 8
26 13 2 17 28 11
3 22 27 12 7 18
14 25 16 1 10 29
21 4 23 8 19 6
24 15 20 5 30 9
2.实验分析及结论