马的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个角都包含两条特殊的边:

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

 

 

 

 

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

分割棋盘:

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

合并棋盘:

 

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

 

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

 

 

 

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

分执法计算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) 为棋盘的规模。

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值