中北大学算法分析与设计实验报告三(数字旋转方阵)

这篇具有很好参考价值的文章主要介绍了中北大学算法分析与设计实验报告三(数字旋转方阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中北大学算法分析与设计实验报告三(数字旋转方阵)

1.实验名称

实验三 分治与减治算法实验

2.实验目的

(1)掌握分治法的设计思想;
(2)掌握数字旋转方阵的具体实现过程;
(3)熟练掌握二维数组的使用方法;
(4)在掌握的基础上编程实现数字旋转方阵的实现过程。

3.训练知识点集群

(1)根据实验内容设计算法伪代码进行算法描述;
(2)利用C++/C/Java等编程语言对算法伪代码进行工程化实现;
(3)输入测试用例对算法进行验证;
(4)列出算法时间复杂度模型并与计算机运行统计时间进行对比分析。

4.实验内容

给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。

5.实验原理

题目1、数字旋转方阵程序设计

(1)问题描述
给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明,并分析其算法复杂度。

(2)算法思想
用二维数组data[N][N]表示NxN的方阵,观察方阵中数字的规律,可以从外层向里层填数。
设变量size表示方阵的大小,则初始时size=N,填完一层则size=size2;设变量begin表示每一层的起始位置,变量i和j分别表示行号和列号,则每一层初始时i=begin,j=begin。
将每一层的填数过程分为A、B、C、D四个区域,则每个区域需要填写size-1个数字,填写区域A时列号不变行号加1,填写区域B时行号不变列号加1,填写区域C时列号不变行号减1,填写区域D时行号不变列号减1。
显然,递归的结束条件是size等于0或size等于1。

(3)算法描述:
1.输入:当前层左上角要填的数字number,左上角的坐标begin,方阵的阶数size
2.输出:数字旋转方阵
3.如果size等于0,则算法结束;
4.如果size等于1,则data[begin][begin] = number,算法结束;
5.初始化行、列下标i=begin,j=begin;
6.重复下述操作size-1次,填写区域A
data[i][j]=number;number++;
行下标i++;列下标不变;
7.重复下述操作size-1次,填写区域B
data[i][j]=number;number++行;下标不变;列下标j++;8.重复下述操作size-1次,填写区域C
data[i][j]=number;number++;行下标i–;列下标不变;9.重复下述操作size-1次,填写区域D
data[i][j]=number;number++;行下标不变,列下标j–;
10.调用函数Full在size-2阶方阵中左上角begin+1处从数字number开始填数;

6.源代码实现

#include <stdio.h>
int data[100][100]={0};
int maxsize = 0;
void printData(int size){
    for(int i=0;i<size;i++){
        for(int j=0;j<size;j++)
            printf("%4d",data[i][j]);
            printf("\n");
        } 
        printf("\n");
    } 
void Full(int number, int begin, int size){ //从number开始填写size阶方阵,左上角的下标为(begin, begin)
    int i,j, k;
    if (size == 0) //递归的边界条件,如果size等于0,则无须填写
        return;
    if (size == 1){ //递归的边界条件,如果size等于1
        data[begin][begin] = number; //则只须填写number
        printData(maxsize);
        return;
    }
i = begin; j = begin; //初始化左上角下标
    for(k = 0; k < size - 1; k++){ //填写区域A,共填写size- 1个数
        data[i][j] = number; //在当前位置填写number
        number++; i++; //行下标加1
    } 
    for(k = 0; k < size - 1; k++){ //填写区域B,共填写size- 1个数
        data[i][j] = number; //在当前位置填写number
        number++; j++;//列下标加1
    } 
    for(k = 0; k < size- 1; k++){ //填写区域C,共填写size- 1个数
        data[i][j] = number; //在当前位置填写number
        number++; i--; //行下标减1
    } 
    for(k = 0; k < size- 1; k++){ //填写区域D, 共填写size - 1个数
        data[i][j] = number; //在当前位置填写number
        number++;j--; //列下标减1
    } 
    printData(maxsize);
    Full(number, begin + 1, size - 2); //递归求解,左上角下标为begin + 1
}
 
int main(){ 
    int size;
    printf("输入方阵的大小: "); 
    scanf("%d", &size);
maxsize = size;
printf("开始填充之前的数字旋转方阵: \n"); 
    printData(maxsize);
    printf("填充过程: \n");
    Full(1 , 0, size);
    printf("最终填充完成的结果是: \n");
    printData(maxsize);
    return 0; 
}

7.实验结论及心得体会

(1)算法复杂度
算法SquareMatrix的复杂度如下:
如果n=0时,T(n)=0;
如果n=1时,T(n)=1;
如果n>1时,T(n)=O(n^2);

(2)心得体会
通过本次实验,我理解了分治法的设计思想,学会了数字旋转方阵的具体实现过程,掌握了二维数组的使用方法并且编程实现数字旋转方阵的实现过程,更深刻地掌握了时间复杂度和空间复杂度的理解以及递归思想;通过一步步解决问题、编写代码,增强了动手能力。文章来源地址https://www.toymoban.com/news/detail-404331.html

到了这里,关于中北大学算法分析与设计实验报告三(数字旋转方阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包