7 7 1
6 6 1
5 8 3
8 5 2
8 8 1
【知识准备】
分治思想和递归程序设计。
【算法分析】
拿到这个问题后,便有一种递归重复的感觉。首先对最简单的情况(即 k=1)进行分析:
公主只会在 4 个方格中的一个:
左上角:则使用 3 号毯子补,毯子拐角坐标位于(2, 2);{下面就简称为毯子坐标}
左下角:则使用 2 号毯子补,毯子拐角坐标位于(1, 2);
右上角:则使用 1 号毯子补,毯子拐角坐标位于(2, 1);
右下角:则使用 4 号毯子补,毯子拐角坐标位于(1, 1);
其实这样不能说明什么问题,但是继续讨论就会有收获,即讨论 k=2 的情况(如图 4-
1):
# # #
●
#
○
# #
#
○ ○
#
# # # #
我们假设公主所在的位置用实心圆表示,即上图中的(1, 4),那么我们就可以把 1 号毯子
放在(2, 3)处,这样就将(1, 3)至(2, 4)的 k=1 见方全部覆盖(#表示地毯)。接下来就是 3 个
k=1 的见方继续填满,这样问题就归结为 k=1 的情况了,但是有一点不同的是:没有“公
主”了,每一个 k=1 的小见方都会留下一个空白(即上图中的空心圆),那么空白就有:1*3
=3 个,组合后便又是一个地毯形状。
好了,现在有感觉了吧,我们用分治法来解决它!对于任意 k>1 的宫殿,均可以将其化
分为 4 个 k/2 大小的宫殿,先看一下公主站的位置是属于哪一块,因为根据公主所在的位
置,我们可以确定中间位置所放的毯子类型,再递归处理公主所站的那一块,直到出现边
界条件 k=1 的情况,然后在公主边上铺上一块合适的地毯,递归结束。
由于要递归到每一格,复杂度就是面积,就是 O(2
2*k
*k)。
评论5
最新资源