棋盘覆盖问题,是一类用分治法来求解的数学问题。
这个问题的一般描述是这样的:
如上图所示,(这个图是我网上copy来的),这是一个4*4规模的棋盘。
对于这类问题来讲,棋盘的规模一般都是 2^k*2^k,二的k次幂乘以二的k次幂,很明显,这里面,我们取k为2.我们将图a中的阴影部分称作为一个特殊棋盘,当然,你也可以说把阴影放到其他位置上去也可以构成一个特殊棋盘。
然后,我们有图b这样四种不同类型的骨牌,问题想要解决的是,如何用这些骨牌去完全覆盖除阴影部分外的其他区域。
那么,我手绘一个示意图,大家尝试去理解一下:
大家可以看到,我用红色来覆盖这个区域,恰好是可以覆盖的,毫无疑问,如果能够恰好覆盖这个区域的话,我们需要骨牌的数量是:
(4*4-1)/3=5 块
另外,如果你尝试使用另外的某些覆盖方式,可能不可以完全去覆盖每一个空格,可能会留有空格。
那么,如何去寻找这样一种覆盖方法呢?
这里面,我们谈一谈思路:
第一个思路:穷举,毫无疑问,穷举出所有的可能,选出其中的可行方案,这在编码上是不存在太大问题的,但是,算法的复杂度会很大。
第二个思路:分治法,所谓分治法,就是将一个复杂的问题,分割成若干个小的问题,然后递归地去调用,从底向上地去解决这个问题。
一种递归实现的思路是:
将这个4*4规模的棋盘进行分割,分割成为2*2的 棋盘,那么,可以分割成四个,然后,我们对这个小棋盘进行覆盖,这里面我们能看到骨牌的数量是3,那么这个2*2规模的棋盘实际上就是递归的终点了,不可能再分割了,这里面做一个判断。同理,如果这个棋盘的规模是8*8,也就是前面的k是3的情况,棋盘自然分割成 4*4 然后再分割为2*2,这个过程是用递归来完成的。
这里面,需要注意一下,在递归的时候,是要给其准备一个参数,这个参数用来表明这个分割后的小棋盘所在的位置,因为,不同的位置,是需要不同的骨牌来覆盖的,譬如,上面图a中最右上角的部分,显然,如果用第一个骨牌来覆盖,就会自然造成一个空白区域,这是需要读者去做一个判断的。
相关文章
- 棋盘覆盖(大数处理)
- 棋盘覆盖(大数问题)
- 算法总结:【线段树+扫描线】&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828)
- 覆盖问题:最大覆盖问题(Maximum Covering Location Problem,MCLP)和集覆盖问题(Location Set Covering Problem,LSCP)
- Python中循环后使用list.append()数据被覆盖问题的解决
- [BZOJ]1052 覆盖问题(HAOI2007)
- COGS728. [网络流24题] 最小路径覆盖问题
- 两侧覆盖问题解
- Python基于回溯法子集树模板解决马踏棋盘问题示例
- hiho #1143 : 骨牌覆盖问题·一 (运用快速幂矩阵)