数据结构n阶魔方课程设计终极版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、需求分析
1.问题回顾
题目名称:n阶魔方(3≤n≤15)
题目描述:n阶魔方,又叫幻方阵,在我国古代称为“纵横图”,是一个比较有趣的游戏。所谓n 阶魔方就是一个填数游戏。要求用1到n2的数字(3≤n≤15)不重复地填入方针中,使得每一行、每一列、每条对角线上的数字累家和都相等。
例如,图1-1所示就是一个3阶魔幻方阵。它是用数字1到9不重复地填入3×3方针中,使得方
15。
图1-1
功能要求:
1)、输入一个数字n(3≤n≤15),则输出对应的n阶魔幻方阵,并输出每一行、每一列、每条对角线上的数字累家和;
2)、若输出数字n超出要求范围,则提醒用户重新输入n;
3)、但输入数字为0时,操作结束,退出程序。
使用多维数组输出魔幻方阵,分别用4个子函数实现相应的功能;
输入形式:数字n(3≤n≤15)
输出形式:(1)以矩阵的形式输出n(3≤n≤15)阶魔幻方阵;
(2)输出魔幻方阵每一行、每一列、每条对角线上数字累加和;
(3)输出程序运行时间复杂度。
2.问题及算法分析:
1)当n为奇数时,n阶魔幻方阵有多种实现方法,其中之一就是“左上斜行法”。该方法的基本思想如下。a)在1到n2的数字中,选择1开始填充魔方,将数字1填入第1行的中间方格中,即(0,n/2)位置。b)向已填充的前一个数字位置(p,q)的左上角(p-1,q-1)填入下一个数字。如果出现以下情况,则修改填充位置:ⅰ)若填充位置超出上边界,则修改为下边界的相应位置,即把p-1修改为n-1;ⅱ)若填充位置超出左边界,则修改为最右边的相应位置,即把q-1修改为n-1;ⅲ)若该位置已有数字,则填充位置修改为下一行,同一位置。c)重复以上过程,直至将n2个数字全部填入魔方中。
2)当n为双偶数时,魔幻方阵的实现方法如下。a)把1到n2依次填入n×n的n阶方阵中;b)方阵行数与列数之和除4取余为3或者行数除4的余数等于列数除4的余数,则此位置上数不变,c)将其余数a[p][q] 与a[n-1-p][n-1-q]位置对调即可得到双偶数n阶魔幻方阵。
3)当n为单偶数时,魔幻方阵的实现方法如下。a)将n阶单偶幻方表示为4m+2阶幻方。将其等分为四分,成为如下图所示A、B、C、D四个2m+1阶奇数幻方。
A C
D B
b)A用1至(2m+1)*(2m+1)填写成(2m+1)阶幻方;B用(2m+1) *(2m+1)+1至2*(2m+1) *(2m+1)填写成2m+1阶幻方;C用2*(2m+1) *(2m+1)+1至3*(2m+1) *(2m+1)填写成2m+1阶幻方;D用3*(2m+1) *(2m+1)+1至4*(2m+1) *(2m+1)填写成2m+1阶幻方;c)在
A中间一行取m个小格,其中1格为该行居中1小格,另外m-1个小格任意,其他行左侧边缘取m列,将其与D相应方格内交换;B与C接近右侧m-1列相互交换,即的n阶魔幻方阵。
二、总体设计
本次程序设计主要采用了C语言的结构化程序设计思想,采用过程设计方法,以功能函数为基本结构单位,对问题中的功能要求做出了准确的实现。
1、在数据结构与数据存储表示方面,使用二维数组a[n][n]来静态存储不超过n行n列的数组方阵,其中n(3≤n≤15)为满足条件的数。
2、在功能函数实现方面,主要使用与实现了如下函数:
1)void main()函数,主函数,调用以下子函数,实现魔幻方阵填充与输出,实现问题要求功能;
2)#include
3)void jishu(int n)函数,n为奇数时实现n阶魔幻方阵,并调用函数out(n,a)和check(n,a),实现魔幻方阵的输出,检验魔幻方阵的准确性;
4)void shuang(int n)函数,n为双偶数时实现n阶魔幻方阵,并调用函数out(n,a) 和check(n,a),实现魔幻方阵的输出,检验魔幻方阵的准确性;
5)void dan(int n)函数,n为单偶数时实现n阶魔幻方阵,并调用函数out(n,a) 和check(n,a),实现魔幻方阵的输出,检验魔幻方阵的准确性;
6)void out(int n,int a[15][15])函数,实现魔幻方阵的输出;
7)void check(int n,int a[15][15])函数,验证魔幻方阵的准确性。
三、各函数逻辑关系调用图
四、本程序执行流程图
三、详细设计
1、基本功能函数具体实现细节及算法分析
1). void jishu(int n)
该函数实现“左上斜行法”。该方法的算法(基本思想)如下。a)在1到n2的数字中,选择1开始填充魔方,将数字1填入第1行的中间方格中,即(0,n/2)位置。b)向已填充的前一个数字位置(p,q)的左上角(p-1,q-1)填入下一个数字。如果出现以下情况,则修改填充位置:ⅰ)若填充位置超出上边界,则修改为下边界的相应位置,即把p-1修改为n-1;ⅱ)若填充位置超出左边界,则修改为最右边的相应位置,即把q-1修改为n-1;ⅲ)若该位置已有数字,则填充位置修改为下一行,同一位置。c)重复以上过程,直至将n2个数字全部填入魔方中。
2). void shuang(int n)
此函数主要采用了二维矩阵的算法将双偶数魔幻方阵填入并输出。其具体算法如下:当n能被4整除时,n为双偶数,a)把1到n2依次填入n×n的n阶方阵中;b)方阵行数与列数之和