算法设计与分析实验:分治与减治算法实验:题目1 数字旋转方阵程序设计

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

目录

前言

一、数字旋转方阵

二、实验内容

三、实验目的

四、实验步骤

五、实验过程

 总结


前言

算法同样是计算机四大件的一个很重要的内容,本实验的目的是通过编写一个数字旋转方阵程序,来掌握分治与减治算法的基本思想和实现方法。


一、数字旋转方阵

数字旋转方阵是一个n×n的矩阵,其中每个元素是从1到n^2的自然数,且按照顺时针旋转的方式排列。例如,当n=4时,数字旋转方阵如下:

 1  2  3  4
12 13 14  5
11 16 15  6
10  9  8  7

本实验要求使用分治或减治算法来设计一个高效的数字旋转方阵程序,并分析其时间复杂度和空间复杂度。同时,要求使用适当的数据结构来存储和输出数字旋转方阵,以及提供一个友好的用户界面,让用户可以输入n的值,并查看生成的数字旋转方阵。
 

二、实验内容

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

本文中所使用语言是c++

三、实验目的

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

四、实验步骤

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

五、实验过程

1、算法分析

数字旋转方阵算法是一种填充数字的算法,它可以将数字填充到一个旋转的矩阵中。该算法的实现过程如下:

  1. 声明二维数组a ,size为需建立的方阵阶数,初始化i,j,num为1
  2. 若size=0,则循环结束;
  3. 若size=1,则使a [i] [j]=num,循环结束;
  4. 填写区域A,重复操作size-1次
    • a [i] [j]=num;i++;num++;
  5. 填写区域B,重复操作size-1次
    • a [i] [j]=num;j++;num++;
  6. 填写区域C,重复操作size-1次
    • a [i] [j]=num;i–;num++;
  7. 填写区域D,重复操作size-1次
    • a [i] [j]=num;j–;num++;
  8. i++;j++;size=size-2;
  9. 返回第1步;
  10. 循环结束后,输出数组a;

该算法的时间复杂度为O(n^2),其中n为方阵的阶数。该算法可以用于填充数字到一个旋转的矩阵中。例如,我们可以使用该算法来生成一个螺旋状的数字矩阵。

2、写出伪代码

声明二维数组a ,size为需建立的方阵阶数,初始化i,j,num为1
若size=0,则循环结束;
若size=1,则使a [i] [j]=num,循环结束;
填写区域A,重复操作size-1次
a [i] [j]=num;i++;num++;
填写区域B,重复操作size-1次
a [i] [j]=num;j++;num++;
填写区域C,重复操作size-1次
a [i] [j]=num;i--;num++;
填写区域D,重复操作size-1次
a [i] [j]=num;j--;num++;
i++;j++;size=size-2;
返回第1步;
循环结束后,输出数组a;

3、代码实现

#include <iostream>
#include <iomanip>
using namespace std;

void NFangZhen (int n) {
    int size=n;
    int flag=0; //设置转换方向标志
    int a [100] [100]; //设置二维数组
    int i=0,j=0,num=1;
    while (1) {
        if (size==0) break;
        else if (size==1) {
            a [i] [j]=num;
            break;
        }
        else {
            do //区域A
            {
                a [i] [j]=num;
                i++;
                num++;
                flag++;
            }while (flag<size-1);
            flag=0;
            do //区域B
            {
                a [i] [j]=num;
                j++;
                num++;
                flag++;
            }while (flag<size-1);
            flag=0;
            do //区域C
            {
                a [i] [j]=num;
                i--;
                num++;
                flag++;
            }while (flag<size-1);
            flag=0;
            do //区域D
            {
                a [i] [j]=num;
                j--;
                num++;
                flag++;
            }while (flag<size-1);
            flag=0;
        }
        size-=2;
        i++;
        j++;
    }
    for (int i=0;i<n;i++) {
        for (int j=0;j<n;j++) {
            cout<<setw(4)<<a [i] [j]<<" ";
        }
        cout<<endl;
    }
}

int main () {
    int n;
    cout<<"请输入数字旋转方阵的阶数:";
    cin>>n;
    NFangZhen(n);
}

4、用例测试

算法设计与分析实验:分治与减治算法实验:题目1 数字旋转方阵程序设计

5、分析复杂度

数字旋转方阵算法的时间复杂度为O(n2),其中n为方阵的阶数。这是因为该算法需要填充n2个数字到一个n*n的矩阵中,每个数字都需要执行一次赋值操作,因此总共需要执行n2次赋值操作。因此,该算法的时间复杂度为O(n2)


 总结

这篇文章是数字旋转方阵程序设计的实验报告。文章介绍了数字旋转方阵的存储结构和算法设计。程序采用二维数组的存储结构进行数字旋转方阵的存储,每一层的数字分作四个小组,每一组的数字个数为N-1,通过设立一个标志来判断转换方向。文章来源地址https://www.toymoban.com/news/detail-429017.html

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

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

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

相关文章

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

    1.实验名称 实验三 分治与减治算法实验 2.实验目的 (1)掌握分治法的设计思想; (2)掌握数字旋转方阵的具体实现过程; (3)熟练掌握二维数组的使用方法; (4)在掌握的基础上编程实现数字旋转方阵的实现过程。 3.训练知识点集群 (1)根据实验内容设计算法伪代码

    2023年04月08日
    浏览(76)
  • 算法分析与设计---分治+动态规划

    1.分治法 适用条件: 问题规模缩小到一定程度容易求解 问题可以分解为若干个规模较小的 相同 子问题,即问题具有最优子结构( 使用分治法前提 ) 可以利用子问题的解合并为该问题的解( 决定是否使用分治法 ) 各个子问题 相互独立 ,即子问题之间不包含公共子问题(

    2024年02月07日
    浏览(45)
  • 【算法设计与分析】分治法(最近点对问题)

    目录 实验目的 实验内容与结果 蛮力法求解 分治法求解 实验总结 (1)掌握分治法思想。 (2)学会最近点对问题求解方法。 算法过程: 遍历n个点与剩余n-1个点之间的距离,在计算点对距离时不断更新最短距离的值,遍历完所有点对后即可求得最短点对距离。 伪代码: 复

    2024年02月08日
    浏览(48)
  • 算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

    算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征: 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性: 时间复杂性 和空间复

    2024年02月02日
    浏览(44)
  • 南京邮电大学算法与设计实验二:贪心算法(最全最新,与题目要求一致)

    三、实验原理及内容 实验原理: 1 、用贪心法实现求两序列的一般背包问题。要求掌握贪心法思想在实际中的应用,分析一般背包的问题特征,选择算法策略并设计具体算法,编程实现贪心选择策略的比较,并输出最优解和最优解值。 2 、用贪心法求解带时限的 ( 单位时间

    2024年02月05日
    浏览(51)
  • 五种基础算法小结与典型题目分享(动态规划、分治、贪心、回溯、分支限界)

    动态规划是用于解决多阶段决策问题的算法策略。它通过用变量集合描述当前情境来定义“状态”,进而用这些状态表达每个阶段的决策。 每个阶段的状态是基于前面的状态经过某种决策得到的。通过建立状态间的递推关系,并将其形式化为数学递推式,得到“状态转移方程

    2024年01月19日
    浏览(65)
  • 南京邮电大学算法与设计实验四:回溯法(最全最新,与题目要求一致)

    要求用回溯法求解8-皇后问题,使放置在8*8棋盘上的8个皇后彼此不受攻击,即:任何两个皇后都不在同一行、同一列或同一斜线上。请输出8皇后问题的所有可行解。 用回溯法编写一个递归程序解决如下装载问题:有n个集装箱要装上2艘载重分别为c1和c2的轮船,其中集装箱i的

    2024年02月05日
    浏览(60)
  • 算法设计与分析实验---动态规划

    任务描述 沿着河岸摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 例如: 4 堆石子 4,5,9,4 ,可以按 (((4,5),9),4) 合并。 第一次合并得分是 9 分,合并之后石子堆是 9,9,4 第二次合并得

    2024年02月08日
    浏览(50)
  • 【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

    本次实验(一)见博客:【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(一)、实验指导书 说明 :本次实验的代码使用verilog编写,文章中为阅读方便,故采用matlab代码格式。 2.1、需求分析 本次实验要求设计一种通过操作开关的时间控制灯

    2024年04月26日
    浏览(46)
  • 算法设计与分析 实验三 动态规划

    1.打家劫舍:  给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 入: 每组测试案例有两行,第一行只有一个整数N,代表着有N间房屋 第二行有N个整数,代表着每间房屋里的金额,金额范围[0, 1000]。 出:

    2024年01月24日
    浏览(78)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包