实验三
一、实验目的
掌握分治法的设计思想、具体实现和时间复杂度分析。。
二、实验要求
先用伪代码或流程图描述利用分治法解决的算法解决方案,再用程序实现,计算时间复杂度,记录最终测试数据和测试结果,运行时间。
三、算法伪代码或流程图
(1) 数字旋转方阵
输入:当前层左上角要填的数字number,左上角的坐标begin,方阵的阶数size
输出:数字旋转方阵
-
如果size等于0,则算法结束;
-
如果size等于1,则d[begin][begin] = number,算法结束;
-
初始化行、列下标:i = j = begin;
-
重复下述操作size-1次,填写区域A
4.1 d[i][j] = number; number++;
4.2 i++; -
重复下述操作size-1次,填写区域B
5.1 d[i][j] = number; number++;
5.2 j++; -
重复下述操作size-1次,填写区域C
6.1 d[i][j] = number; number++;
6.2 i--; -
重复下述操作size-1次,填写区域D
7.1 d[i][j] = number; number++;
7.2 j--; -
调用函数Full在size-2阶方阵中左上角begin+1处从数字number开始填数;
(2) 最大子段和问题
(3) 棋盘覆盖问题
输入:棋盘左上角坐标(tr,tr);特殊方块的位置(dr,dr);棋盘大小size;
输出:使用L型骨牌覆盖好的棋盘 -
覆盖左上角子棋盘
-
覆盖右上角子棋盘
(2) (2) (2) (2) (2) (2) (2)
四、程序实现
(1) 数字旋转方阵
include
using namespace std;
define MAX 100
int d[MAX][MAX];
void Full(int number, int begin, int size);
int main() {
int n;
cout << "请输入方阵阶数n:" << endl;
cin >> n;
Full(1, 0, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(i<n-1)
cout << d[i][j] << " " ;
else
cout << d[i][j] << " ";
}
cout << endl;
}
}
void Full(int number, int begin, int size) {
int i, j, k;
if (size == 0)
return;
if (size == 1) {
d[begin][begin] = number;
return;
}
i = j = begin;
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
i++;
}
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
j++;
}
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
i--;
}
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
j--;
}
Full(number, begin + 1, size - 2);
}
(2) 最大子段和问题
(3) 棋盘覆盖问题
(2) (2) (2) (2) (2) (2) (2)
五、实验结果展示、时间复杂度分析
(1) 数字旋转方阵
结果展示:
时间复杂度:O(n^2)
(2) 最大子段和问题
(3) 棋盘覆盖问题
(2) (2) (2) (2) (2) (2) (2)