马的Hamilton周游问题,O(N)解决,N表棋盘规模

    马的周游这个问题是搜索的经典问题,但是搜索的时间效率极低,并随着棋盘的扩大呈指数级增长,最终导致问题几万年不可解。如果题目放宽要求:

1、只需要求出周游的一条路线

2、棋盘的长和宽|L-W|<=2

有这两个条件就能使得问题复杂度简化,最终能在棋盘规模的复杂度下解决。

定义n*n的棋盘的每一个点为图G的顶点Vn*n的棋盘的每一个点和从这个起点一步可达的点的连线为图G的边E。这样图Gn*n个顶点和4n^2-12n+8条边。马的Hamilton周游问题即是图GHamilton回路问题。当棋盘点的个数n*n为奇数时,问题无解,因为如果此棋盘是国际象棋的棋盘,则每一次马步都是从白色跳到黑色或者黑色跳到白色,棋盘点为奇数不可能使最后一步跳回起点。

考察一类具有特殊结构的解,这类解在棋盘的4个角都包含两条特殊的边:

马的Hamilton周游问题,O(N)解决,N表棋盘规模_第1张图片

算法在计算过程中必须依赖一些事先计算好的少量数据,所以必须通过回溯用O(1)的时间内计算6*66*88*88*1010*1010*12的结构化棋盘。(因为这些棋盘的规模与N无关,可以事先计算好)

 

马的Hamilton周游问题,O(N)解决,N表棋盘规模_第2张图片

 

 

 

其中8*6的棋盘可以通过6*8的棋盘旋转得到,不影响结构化棋盘的性质。对于LW>=12,可以采用分治策略。

分割棋盘:

将棋盘尽可能平均地分割成4块。当L,W=4k时,分割为22k;当m,n=4k+2时,分割为12k12k+2

合并棋盘:

 

4个子棋盘由于都是结构化棋盘,必定会有以下的马步出现。

马的Hamilton周游问题,O(N)解决,N表棋盘规模_第3张图片

 

其中ABCD在不同的子棋盘上,通过变换,拆掉这几条边,换EFGH这几条边:

 

 马的Hamilton周游问题,O(N)解决,N表棋盘规模_第4张图片

 

这样就能把四个字棋盘合成一个大棋盘。

分执法计算L*W棋盘上的Hamilton回路所需计算时间为T(L,W),则T(L,W)满足如下递归式:

T(L,W) = O(1)     L,W<12

T(L,W) = 4T(L/2,W/2) + O(1)

解此递归式可得T(L,W) = O(L*W) 为棋盘的规模。

 

你可能感兴趣的:(算法)