骑士漫游问题.docxVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
骑士漫游问题 问题描述:国际象棋中骑士按L形进行跳跃,在8*8的棋盘上找到一条路径,从某起始位置出发,不经过重复的格,走遍棋盘上的所有格。 需求分析: 棋盘N*N个格子,由于要不重复路线,所以每个格子要有个标记来表明起已经/未被访问过,故可以一个二维布尔组模拟棋盘。 棋子有属性当前位置,可以用两个整数表示当前位置。跳跃方式,根据国际象棋规则,骑士有8个方向可以跳跃,若当前位置是(x,y),则其可跳跃格为(x 1,y 2)和(x 2,y 1),用0—7的编号代表其中一种跳跃方式。 概要设计:采用尝试回溯的方法寻找路径。用一个N*N长度的栈保存路径。起始位置进栈,从当前位置出发,即栈顶元素位置,依顺序像八个方向进行试探,若试探方向未被访问且没有越界,则跳跃到此格,此位置进栈,继续进行试探,直到走完怎么棋盘为止。若八个方向均不能跳跃,则当前位置出栈,退回上一步,寻找新的方向继续进行尝试。已走完整个棋盘的条件为栈满,即栈内的元素个数等于栈长度。若栈为空,则说明无可行路径走完棋盘。 对此进行进一步讨论,此方法存在大量回溯,时间代价非常大,在8*8的棋盘上很可能在可容忍的时间类无法找到路径,所以对起进行优化。考虑棋盘,直观的,按骑士走法,中间最容易被访问,边角最难以访问到。进一步考虑棋盘每一格,按骑士走法,能访问到此格的上一格的个数是不同的,把能访问此格的上一格的个数之和称为每格的访问能力。所以优化方法为:尽量先访问访问能力低的格子。为此给棋盘添加一个N*N的二维数组,表示每格的访问能力值。给棋子添加一个8长度的数组,用来表示优先访问顺序。计算每格的访问能力算法:从棋盘上的每格出发,向八个方向进行尝试,若没有超出边界,则此格访问能力加1。优先访问顺序算法:重当前位置想八个方向试探,记录八个位置,比较访问能力数组,找到八个位置的访问能力,若越界,则需要最后访问,所以访问能力可以设为9,最后对八个位置按访问能力进行排序,得到优先访问顺序。 程序代码如下: ------------------------------华丽丽的分割线------------------------- public class SeqStackE { //用到的顺序栈类 private Object value[]; private int top; private int length; //栈内元素个数 public SeqStack(int capacity) { value=new Object[capacity]; top=-1; length=0; } public boolean isEmpty(){ return this.top==-1; } public boolean push(E element){ if(element==null) return false; top ; value[top]=element; length ; return true; } public E pop(){ if(!isEmpty()){ E temp=(E)value[top]; value[top]=null; top--; length--; return temp; } else return null; } public E get(){ if(!isEmpty()) return (E)value[top]; else return null; } public int length(){ return this.length; } public int valueLength(){ return this.value.length; } } ------------------------------华丽丽的分割线------------------------- public class Knight { //骑士棋子

文档评论(0)

勤能补拙 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档