实验三 分治算法设计与应用
一.实验目的和要求
1.加深对分治算法的基本思想、基本步骤和一般形式的理解,掌握分治算法设计的基
本方法。
2.用分治法设计 L 型组件填图问题的算法,分析其复杂性,并实现;
3.用分治法设计求数列中的第 1~k 小元素的算法,分析其复杂性,并实现。
二.基本原理
将原问题分解成若干个相互独立问题的与原问题性质相同的子问题,用同样的方法解
这些子问题并将这些子问题的解组合起来得到原问题的解。
子问题还用相同的分治方法解,分治过程一直进行下去,直至子问题的规模充分小,可
直接解为止。
三. 该类算法设计与实现的要点
分治算法的一般步骤:
分解 → 直接或递归求解子问题 → 组合
由于分治法本身的递归特性,一般用递归实现分治算法。
分治法解题往往采用递归的方法实现,在递归求解子问题时同样要注意理清递归关系、
递归出口、参数设置等问题。
最后,通过组合子问题形成原问题的解。
四.实验内容
(一)L 型组件填图问题
1.问题描述
设 B 是一个 n×n 棋盘,n=2
k
,(k=1,2,3,…)。用分治法设计一个算法,使得:用若干
个 L 型条块可以覆盖住 B 的除一个特殊方格外的所有方格。其中,一个 L 型条块可以覆盖
3 个方格。且任意两个 L 型条块不能重叠覆盖棋盘。
例如:如果 n=2,则存在 4 个方格,其中,除一个方格外,其余 3 个方格可被一 L 型
条块覆盖;当 n=4 时,则存在 16 个方格,其中,除一个方格外,其余 15 个方格被 5 个
L 型条块覆盖。
2. 具体要求
输入一个正整数 n,表示棋盘的大小是 n*n 的。输出一个被 L 型条块覆盖的 n*n 棋盘。
该棋盘除一个方格外,其余各方格都被 L 型条块覆盖住。为区别出各个方格是被哪个 L 型
条块所覆盖,每个 L 型条块用不同的数字或颜色、标记表示。
3. 测试数据(仅作为参考)
输入:8
输出:A 2 3 3 7 7 8 8
2 2 1 3 7 6 6 8
4 1 1 5 9 9 6 10
4 4 5 5 0 9 10 10
12 12 13 0 0 17 18 18
12 11 13 13 17 17 16 18
14 11 11 15 19 16 16 20