谈一谈棋盘覆盖问题

棋盘覆盖问题,是一类用分治法来求解的数学问题。
这个问题的一般描述是这样的:
一张示意图
如上图所示,(这个图是我网上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中最右上角的部分,显然,如果用第一个骨牌来覆盖,就会自然造成一个空白区域,这是需要读者去做一个判断的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值