回溯法的应用(实验报告)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.实验分析及结论

相关文档
最新文档