棋盘覆盖算法

来源:互联网 发布:房屋室外设计软件 编辑:程序博客网 时间:2024/05/16 13:05

本文原创,转载请注明来源网址:http://blog.csdn.net/piyajee

 

作者:piyajee

在一个2^k*2^k个方格组成的棋盘中,若恰有一个方格与其它方格不同,则称该方格为一特殊方格,称改棋盘为一特殊棋盘。显然特殊方格在棋盘上出现的位置有4^k种情形。因而对任何k>=0,有4^k种不同的特殊棋盘。下图所示的特殊棋盘为k=216个特殊棋盘中的一个。


<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

在棋盘覆盖问题中,要用下图中4中不同形态的L型骨牌覆盖一个给定的特殊棋牌上除特殊方格以外的所有方格,且任何2L型骨牌不得重叠覆盖。易知,在任何一个2^k *2^k的棋盘中,用到的L型骨牌个数恰为(4^k-1)/3


<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

用分治策略,可以设计解棋盘问题的一个简捷的算法。

特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用一个L型骨牌覆盖这3个较小的棋盘的汇合处,如下图所示,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题化为4个较小规模的棋盘覆盖问题。递归的使用这种分割,直至棋盘简化为1x1棋盘。



<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

在此举例:

4*4棋盘:


最终结果



填图顺序


<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

对于4*4棋盘的调用层次研究:





<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

需要重点说明的是,第一层填充(制造特殊方格)总是填充整个棋盘的中心,如图所示:


 

源码:











原创粉丝点击