骑士游历问题算法的研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图1
骑士单次L 形路线的方向示意图
Fig.1Sketch map of knight single L-shaped route directions
收稿日期:2011-03-17
稿件编号:201103098
作者简介:惠燕(1979—),女,陕西咸阳人,硕士,讲师。研究方向:计算机网络管理和计算机软件理论。
骑士游历问题算法的研究
惠燕,潘煜
(西安工业大学计算机学院,陕西西安710032)
摘要:骑士游历问题是一个经典的数学问题。其思想在电路图的设计及图像加密等方面都有帮助,如果能将骑士游历问题算法通过计算机语言程序化将对其在其他领域中的应用有极大帮助。通过研究骑士游历的规则对问题进行数学模型抽象,通过研究骑士游历的方向与可到达情况,将骑士的空间移动抽象成数学表达式,进而映射到程序中所需对应的数据结构形式,最后通过利用JAVA 语言得以实现骑士游历问题中骑士游历过程的动态图形演示。关键词:骑士;游历;欧拉;方向中图分类号:TP311.1
文献标识码:A
文章编号:1674-6236(2011)11-0112-03
Research on knight travel problem algorithm
HUI Yan ,PAN Yu
(College of Computer ,Xi ’an Technological University ,Xi ’an 710032,China )
Abstract :Knight travel problem is a classical mathematical problem.Its thought contributes to the circuit diagram design and image encryption.If it can be programmed which will have great help in other application fields ,it made mathematical model abstraction through the study on the rules of knight travel problems ,researched on the direction and the reached conditions of knight travel ,knight ’s moving was abstracted into mathematical expressions ,then mapped to the corresponding data structures required in the program ,and at last ,using JAVA language realized knight travelled graphic demonstration of dynamic processes.
Key words :knight ;travel ;Euler ;direction
骑士游历问题是一个古老而著名的问题,问题的描述是:在8×8格的国际象棋棋盘上,象棋马能否从某个格子出发按照“马跳日”的规则跳遍所有64个格子最后再回到出发的那个格子?国际象棋中的马,英语为knight ,恰好又意指中世纪西方世界的“骑士”,因此,这个问题又被称为“骑士游历”问题。该问题即可以理解为国际象棋中的棋子在一个空棋盘内移动,问它能否经过六十四格并且只经过一次?骑士按“L ”形路线移动,即在某方向前进两格,接着在与原方向垂直的方向上前进一格。
1骑士游历问题模型的数学抽象
骑士游历问题最初是由大数学家欧拉(Euler )在1759年
开始研究的。定义1:给定无孤立结点图G ,若存在一条路,经过图中每边一次且仅一次,该路称为欧拉路;若存在一条回路,经过图中每边一次且仅一次,该回路称为欧拉回路[1]。
骑士游历问题因为它的典行性和可研究性,引来了国内外很多数学爱好者和程序设计者的注意。自从数学家提出这个问题以来,有很多人开始潜心研究。根据问题的描述可知求解骑士游历问题的每一步就是马在棋盘上走的每一步变化,而具体解决问题的关键在于骑士可走的8个方向以及可走的方向上相应的数据变化的确定[2-3]。
1.1方向的研究1.1.1
方向的分类
骑士游历的规则确定了骑士游历的方向。在国际象棋的
棋盘里总共有8×8个格子,若使棋子“骑士”从任何一个格子开始,按照L 形路线(在某方向前进两格,接着在与原方向垂直的方向上前进一格)移动方法,游历每一个格子,并且每个格子只允许被到达一次,则每次骑士可走的有8个方向的选择。图1是骑士将某一位置作为起始位置,继续按照在某方向前进2格,接着在与原方向垂直的方向前进1格的方式即所谓L 形路线可走的8个方向的示意图。
电子设计工程
Electronic Design Engineering
第19卷Vol.19第11期No.112011年6月Jun.2011
-112-
图1是按理论上骑士在某一个格子时可走的方向进行的说明。其包含2种情况:第1种如果骑士是按图1所示的位置作为起始点进行遍历的,该点则此时是本次遍历的第一步,那么如图所示的8个方向将都是可以走的;第2种如果图示的这一点是骑士游历过程中的某一点,那么这8个方向中就有可能有不可以走的格子,原因在于8个格子中有可能有以前遍历时已经走过的格子。
1.1.2方向的表示
根据骑士行走方向的规则,可以借助于直角坐标系对
骑士可走的8个方向如何表示进行说明。假设骑士此时在棋盘图形界面的位置为(x ,y ),那么8个可能走的方向的位置可分别表示为:1)(x +2,y -1);2)(x +1,y -2);3)(x -
1,y -2);4)(x -2,y -1);5)(x -2,y +1);6)(x -1,y +2);7)
(x +1,y +2);8)(x +2,y +1)。
这8个点是按照顺时针的方
向依次变化的,如图2所示。通过序偶的表示方式,图2借用直角坐标系把骑士可走的8个方向进行了表示。在每一个序偶中x 和y 所加减的数表示的是骑士所在的格子和它可到达的格子的中心距。
1.2可达数的研究
每个格子的可到达数的初始情况如图3所示,图中每
个小格子中的数字代表骑士在相应的格子中可以走的方向数。可以看出,即使把棋子控制在棋盘内部,骑士在任意一个格子中的走法也都不唯一。走法最少的是4个角上的4个格子,为两种走法。虽然每个格子的走法都不唯一,但是必须为每一个格子选择唯一的一条路径来实现骑士的游历,这是需要通过算法来实现的。那么如何在不唯一的路径中选择一条路径来进行游历呢?假使骑士从其中一个格子走到了可到达的一个格子,那么根据题目的要求,骑士就不可以再次到达这2个格子中的任意1个。也就是说它们周围的某些格子骑士可走的方向数要相应地减一。因此可以根据下面两点来拟定改变每个格子可到达数的方式:1)每个格子只能被骑士到达一次;2)任意一个终点都可以根据一定的路径返回到起点;具体操作时任意
一个作为或曾经作为起点的格子的可到达数都置为0,因为它将不可再被到达,也就不可能再到达其他格子;任意一个作为或曾经作为终点却始终未被到达的格子的可到达数均减一,因为它们的起点就是它们作为起点时的终点之一,而此时这个起点已被到达并且不可再被到达,所以它们的路径数也就是可到达数相应地减少了一个。
2基于JAVA 的算法设计与实现
随着计算机技术的不断发展,人们一直在探索着自然语
言和计算机语言之间的映射问题。著名数学家欧拉在没有计算机的时代解决了这个问题,找到了一种解答。而在计算机技术发达的今天,也可以借助程序设计来实现该问题的解答。骑士游历就是一个有信息的图搜索的过程。
要将骑士游历问题程序化,关键是要能设计出马在棋盘上走的每一步的算法。因为在每一步骑士还需要选择一个方向进行游历,所以算法设计中需要从骑士在每个格子中可能
走的方向及骑士在每个格子中的可到达数两个方面进行设计,即当前步的行列位置和当前步已经试探过的方向,将骑士的空间移动抽象成数学方式,进而可以映射到Java 程序中用对应的数据结构来实现[4-6]。所以使用两个数组,它先把8个可能走的方向用两个数组表示出来,这两个数组分别是:
horizontal[]={2,1,-1,-2,-2,-1,1,2};vertical[]={-1,-2,-2,-1,1,2,2,1};它们分别表示水平方向和垂直方向即骑士所
走L 形状所需的x 坐标和y 坐标的变化量。通过这两个数组可以记住棋盘的每个位置是在骑士的第几步到达的,这反映了问题的解,即第几步到哪个位置。数组direction direction[x]
[y]记住在棋盘的某个位置已经试探过的方向,每个位置有8
个方向,可按某种顺序对8个方向编号,然后在每个位置按编号顺序试探方向。在确定数据结构之后,可得骑士游历程序算法流程图,如图4所示。
AccessibleSquare 类主要是算法实现类,其中骑士对8个
方向的游历的主要代码如下:
public AccessibleSquares (int x ,int y ){
图2
骑士可走方向的坐标表示
Fig.2
Coordinate representations of knight ’s direction 图3
棋盘中每个格子的初始可到达数
Fig.3Initial reached number of each grid
惠燕,等骑士游历问题算法的研究
-113-