马的周游这个问题是搜索的经典问题,但是搜索的时间效率极低,并随着棋盘的扩大呈指数级增长,最终导致问题几万年不可解。如果题目放宽要求:
1、只需要求出周游的一条路线
2、棋盘的长和宽|L-W|<=2
有这两个条件就能使得问题复杂度简化,最终能在棋盘规模的复杂度下解决。
定义n*n的棋盘的每一个点为图G的顶点V,n*n的棋盘的每一个点和从这个起点一步可达的点的连线为图G的边E。这样图G有n*n个顶点和4n^2-12n+8条边。马的Hamilton周游问题即是图G的Hamilton回路问题。当棋盘点的个数n*n为奇数时,问题无解,因为如果此棋盘是国际象棋的棋盘,则每一次马步都是从白色跳到黑色或者黑色跳到白色,棋盘点为奇数不可能使最后一步跳回起点。
考察一类具有特殊结构的解,这类解在棋盘的4个角都包含两条特殊的边:
算法在计算过程中必须依赖一些事先计算好的少量数据,所以必须通过回溯用O(1)的时间内计算6*6,6*8,8*8,8*10,10*10,10*12的结构化棋盘。(因为这些棋盘的规模与N无关,可以事先计算好)
其中8*6的棋盘可以通过6*8的棋盘旋转得到,不影响结构化棋盘的性质。对于L,W>=12,可以采用分治策略。
分割棋盘:
将棋盘尽可能平均地分割成4块。当L,W=4k时,分割为2个2k;当m,n=4k+2时,分割为1个2k和1个2k+2。
合并棋盘:
4个子棋盘由于都是结构化棋盘,必定会有以下的马步出现。
其中A,B,C,D在不同的子棋盘上,通过变换,拆掉这几条边,换E,F,G,H这几条边:
这样就能把四个字棋盘合成一个大棋盘。
分执法计算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) 为棋盘的规模。