实验三

一、实验目的
掌握分治法的设计思想、具体实现和时间复杂度分析。。
二、实验要求
先用伪代码或流程图描述利用分治法解决的算法解决方案,再用程序实现,计算时间复杂度,记录最终测试数据和测试结果,运行时间。
三、算法伪代码或流程图
(1) 数字旋转方阵

输入:当前层左上角要填的数字number,左上角的坐标begin,方阵的阶数size
输出:数字旋转方阵

  1. 如果size等于0,则算法结束;

  2. 如果size等于1,则d[begin][begin] = number,算法结束;

  3. 初始化行、列下标:i = j = begin;

  4. 重复下述操作size-1次,填写区域A
    4.1 d[i][j] = number; number++;
    4.2 i++;

  5. 重复下述操作size-1次,填写区域B
    5.1 d[i][j] = number; number++;
    5.2 j++;

  6. 重复下述操作size-1次,填写区域C
    6.1 d[i][j] = number; number++;
    6.2 i--;

  7. 重复下述操作size-1次,填写区域D
    7.1 d[i][j] = number; number++;
    7.2 j--;

  8. 调用函数Full在size-2阶方阵中左上角begin+1处从数字number开始填数;
    (2) 最大子段和问题
    (3) 棋盘覆盖问题
    输入:棋盘左上角坐标(tr,tr);特殊方块的位置(dr,dr);棋盘大小size;
    输出:使用L型骨牌覆盖好的棋盘

  9. 覆盖左上角子棋盘

  10. 覆盖右上角子棋盘

(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)

posted @ 2021-10-08 15:33  xpeanut  阅读(141)  评论(0)    收藏  举报