c语言--分治法经典例题--求解棋盘覆盖问题

本文介绍了一个用L型骨牌覆盖2^k*2^k正方形棋盘的算法,其中特殊方格除外。通过分治策略,将棋盘分为四个区域,并根据特殊方格位置填充对应区域的对角方格,递归执行直至只剩一个方格。在递归过程中,当棋盘大小为1时直接返回,因为填充已在之前的条件分支中完成。核心代码展示了如何根据四个区域的位置关系进行递归处理。

问题描述:

        有一个2^k*2^k的正方形棋盘,在其内部有一个特殊方格标记为0,现在要用L形状的骨牌来覆盖除了特殊方格外的全部期盼,骨牌可以任意旋转但不能重叠。

求解:

        基本思想利用分治把棋盘等分为四块,利用每一块的左上角坐标(tx,ty)特殊方块坐标(x,y)来进行判断,假如特殊方块在左上的区域内,就填充属于其他三个区域最对角的方块,如左上就填充这个区域的最有下的方块,左下就填充这个区域的最右上方块,看图好理解些。

        其实这三个区域的填充部分就是为了将红色区域充当每个区域的特殊方块,好让各自递归的执行下去(所谓的没有条件也要创造条件上:)),当执行到size==1(size为边长)时因就剩一个方格就不需要进行操作,可以直接return了。

        这里为什么size==1就直接返回而不是进行填充,是因为填充的这一步操作在每一个if-else的else里面已经执行了,第一句就是。

        number的值是用来充当不同的L型骨牌.

         这里的method方法就是主要的代码,因为依次检查四个区域属于重复性操作,所以这里就解释第一个if—else。

	if (x < tx + size 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值