马的棋盘遍历的一个近似算法

来源:互联网 发布:淘宝上的碳纤维方向盘 编辑:程序博客网 时间:2024/05/17 07:28
 
马的棋盘遍历的近似算法
国际象棋中的马的遍历问题为:国际象棋中的马能否按照马步访问每一格点一次,最后再回到原地?由于国际象棋中的马又称为骑士,国际象棋中的马的遍历问题也称为骑士遍历问题。
在国际象棋棋盘中,骑士在选择下一个环游点时,共有8种可能的方案(如图所示)。除开其中已经游历的格点和棋盘外的格点,骑士一般还存在多种方案可供选择。对于每一个候选的格点,与之马步相连而还没有游历的棋盘内格点数是不相同的。如果骑士选择其中一个与外部联系最少的格点首先游历,那么,他有可能走的更远。因为对于当前与骑士马步相连的其它格点来说,由于它们与外界联系较多,以后还有机会通过其他格点进一步访问到,而对于与外界联系较少的格点,如果不立即访问,以后很难有机会进一步访问到。
                                         2                   1
 

                           3                                               0
 
                                                   *
 

                           4                                               7
 
 
                                         5                   6
形式化来看,假设一点(i,j)是否被访问用一个标记数组Travel[i][j]来表示,Travel[i][j]=1表示(i,j)已访问,Travel[i][j]=0表示(i,j)没被访问。对于一个格点(i,j),与之相连的格点为(i+x,j+y),其中x、y可能的组合如下:
 
             遍历点    0     1     2     3     4     5     6     7
              x             2     1     -1    -2    -2    -1    1     2
              y             1     2     2     1     -1    -2    -2    -1
 
处于(i,j)点的骑士下一个可能的遍历点构成的集合为
             P(i,j)={(i’,j’)|(i’,j’)与(i,j)马步相连,且Travel[i’][j’]=0,且(i’,j’)在棋盘内}
对于P(i,j)中的每一个元素(i’,j’),计算P(i’,j’)中的元素个数,若其中某个(i”,j”),P(i”,j”)中所含的元素个数最少,则选择(i”,j”)为下一个遍历点。
     骑士能走多远,很大程度上依赖于初始位置的选择。对于8×8的棋盘,初始位置可以为(0,0)、(0,1)、(0,2)、(0,3)、(1,1)、(1,2)、(1,3)、(2,2)、(2,3)和(3,3),由棋盘的对称性,选择其它格点作为初始点没有什么新鲜性。当然,由于在骑士选择下一步游历点时,满足条件的(i”,j”)可能不只一个,而在选择时又总是选其中编号最大或最小的格点,这实际上是为骑士的选择引入了某种方向性,也可以说带有了某种偏见,这种偏见会破坏初始点的对称性,即在棋盘对称的两个初始点,它们的解不是对称的。 
    为了避开这种偏见,也可以从满足条件的一系列点中进行随机选择。当然,也可以将这种思路与回溯法结合在一起使用。