- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
求解骑士游历问题?
显然求解骑士游历问题的每一步就是马在棋盘上走的一步。在每一步马需要选择一个方向进行游历,这时记住解的每一步需要记住两件事:?
1.当前步的行列位置?
2.当前步已经试探过哪些方向了,以便回溯回来时能够选择一个新的方向进行试探?
所以使用两个数组,数组board记住棋盘的每个位置是在马的第几步到达的,这反映了问题的解,即第几步到哪个位置。数组direction记住在棋盘的某个位置已经试探过的方向,每个位置有八个方向,可按某种顺序对八个方向编号,然后在每个位置按编号顺序试探方向。?
在确定数据结构之后,同样需要确定下面几个问题:?
1.怎样的状态是初始状态。?
2.怎样选择当前步可能的路线?
3.怎样表示向前推进一步?
4.怎样回溯及清除当前步的痕迹?
显然初始状态是棋盘的每个位置都置为第0步到达(即还没有到达),每个位置都还没有选择任何方向(可赋值MAX_DIR(=8)表示没有选择方向)。?
选择当前步可能的路线就是在当前位置选择一个方向来游历下一步。在选择的时候同样需要区分是从第0个方向开始考虑还是从上一次的下一个方向开始考虑。为了方便从下一个方向开始考虑,实际上数组direction在某一位置(curr_x, curr_y)的值记住的是从上一位置选择了哪个编号的方向而到达的,这样容易回溯到上一位置,而且容易在回溯到上一位置之后从下个一方向重新试探。?
向前推进一步则要根据所选择的方向推进到下一位置,记住到下一位置所选择的方向,下一位置是第几步到达的,然后增加步数。?
回溯一步则要标记当前位置没有到达过(将到达的步数置为0),根据上一步到当前位置的所选择的方向(这个方向是记录当前位置所对应的direction数组中)而回溯到上一位置,然后减少步数。?
下面程序用类KNIGHT来封装数组board、direction、当前位置(curr_x, curr_y)、当前步数(step),并且使用last_direction来记住上一位置到当前位置所选择的方向。为了方便计算选择一个方向后从当前推进到下一位置,使用数组var_x和var_y来记住每个方向在x方向和y方向的改变值。这个类中提供的方法的含义与类QUEEN类似。为节省篇幅起见,我们将类的界面、实现及演示放在了同一文件。
// 文件:KNIGHT.CPP
// 功能:使用回溯算法求解骑士游历问题
#include iostream.h
#include iomanip.h
enum BOOLEAN {
TRUE = 1,
FALSE = 0
};
const int MAX_WIDTH = 30;
const int MAX_DIR = 8;
class KNIGHT {
public:
// FUNCTION: 设置初始状态
KNIGHT(int width);
// FUNCTION: 用比较直观的方式打印问题的解
// REQUIRE: 必须先调用了成员函数tourist()
void print();
// FUCTION: 根据马的起始位置(start_x, start_y)使用回溯算法求骑士游历问题的一个解
// REQUIRE: (start_x, start_y)必需在所设置的棋盘宽度范围内
BOOLEAN tourist(int start_x, int start_y);
protected:
// FUNCTION: 初始化记录所选方向的数组,将每个值置为MAX_DIR
void init_direction();
// FUNCTION: 初始化记录马在第几步到位每个位置的数组,将每个值置为0
void init_chessboard();
// FUNCTION: 设置初始状态,包括初始化方向数组和棋盘数组,并设置马的初始位置
void set_start(int x, int y);
// FUNCTION: 在当前位置选择一个方向以推进到下一位置
// RETURN: 如果可选择一个方向推进则返回TRUE,否则返回FALSE
// NOTE: 将该函数定义为虚函数,以便下面快速游历的类来重定义该函数而产生动态绑定
virtual BOOLEAN select_direction();
// FUNCTION: 从当前位置回溯到上一位置
// NOTE: 将该函数定义为虚函数,以便下面快速游历的类来重定义该函数而产生动态绑定
virtual void backward();
// FUNCTION: 从当前位置推进到下一位置
// NOTE: 将该函数定义为虚函数,以便下面快速游历的类来重定义该函数而产生动态绑定
virtual vo
您可能关注的文档
- 某公共停车场供配电系统设计.doc
- 实验报告模板:实验二7段数码显示译码器.doc
- 实验二北京科技大学自控实验-(4).docx
- 实验六--计数器及其应用.doc
- 某矿幼儿园施工组织设计.doc
- 实验三:二叉树操作.docx
- 实验三--连续时间LTI系统的时域分析.doc
- 实验三-综合实验-中频自动增益数字电路.docx
- 某物业供水系统水泵PLC控制设计.doc
- 某冶金机械厂降压变电所的电气设计(1).docx
- 新视野二版听说1第6单元示范1课件.ppt
- 【参考答案】 联络口译(第二版) 《联络口译》(第二版)参考答案.pdf
- 梅大高速茶阳路段“5·1”塌方灾害调查评估报告.docx
- 虹吸雨水PE管施工节点标准做法.pdf
- 2025消防设施施工质量常见通病防治手册,典型图示+规范要求.pptx
- 新视野大学英语(第二版)读写教程 4 空军工程大学编U05B.ppt
- E英语教程2(智慧版)Unit 6.pptx
- E英语教程3(智慧版)Unit 7.ppt
- 新视野二版读写1第4单元课件Section A How to Make a Good Impression.pptx
- E英语视听说教程4(智慧版)4-U2课件(2024版)U2.pptx
文档评论(0)