网站大量收购独家精品文档,联系QQ:2885784924

使用回溯算法求解骑士游历问题.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

annylsq + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档