数据结构课程设计之奇数魔方阵
实验四 魔方阵

班级:计算机091 学号:0908140529 姓名:李艳1.实验题目:魔方阵问题2.数据类型typedef struct Array{//n阶的矩阵的类型定义int *base;int b;}Array;3.算法描述构造一个n行n列的二维数组,根据魔方阵的特点进行相应的判断,然后把数字按顺序放到应该存放的数组位置中。
4.程序清单:#include<iostream>using namespace std;typedef struct Array{//n阶的矩阵的类型定义int *base;int b;}Array;void InitArray(Array &A,int n){//构造一个n行n列的二维数组A.base=new int[n*n];A.b=0;void Mofang(int order,Array &A){//按照算法,进行相应的判断,然后把数字按顺序放到应该存放的数组位置中int count;int row,column; //行、列A.b=order;//阶数row=0;column=order/2;for(count=1;count<=order*order;count++){A.base[row*A.b+column]=count;if(count%order==0){ //如果是该行的最后一个,则上一个数的行数加一row++;}else{ //其他情况下,正常的进行行数减一,列数加一row=(row==0)?order-1:row-1;column=(column==order-1)?0:column+1;}}void main(){int order; //阶数int i,j;Array arr;cout<<"请输入阶数:";cin>>order;while(order%2==0){cout<<"阶数必须是一个奇数,请重新输入!"<<endl;cin>>order;}InitArray(arr,order);Mofang(order,arr); //调用解魔方阵的主要函数for (i=0; i<order;i++) { //显示魔方阵for (j=0;j<order;j++) {cout<<"\t"<<arr.base[i*arr.b+j];}cout<<endl;}}5.调试报告请输入阶数: 38 1 63 5 74 9 2请输入阶数: 4阶数必须是一个奇数,请重新输入!517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 96.算法时间复杂度分析:基本操作是:A.base[row*A.b+column]=count 所用时间为T(n)=O(n²)。
数据结构课程设计报告

一、题目奇数阶幻方求解【问题描述】幻方是一种很有意思的数字矩阵,在很早著名的九宫八卦阵就与幻方有关。
幻方的定义为: 1 到 N*N 的整数填入N*N的方格中,每行和每列以及对角线的数字之和必须是相等的。
你作为八卦公司的顶级程序员,现在需要你解决一个问题,将任意奇数阶的幻方找出来。
【基本要求】输入包括多个测试集,每行为一个正奇数N(1 <= N < 1000),0作为输入的结束且不需要处理,对于输入的每一个N,输出一个它所对应的N阶幻方,如果存在多个,任意一个即可,每个幻方为N*N的矩阵,对于每个幻方,每行输出幻方的一行,每行中的数字之间用一个或多个空格分开。
不同的幻方之间用一个空行分开。
二、问题分析及任务定义【问题分析】1、本程序要求输出奇数N阶幻方,其重点应该就是在求幻方的算法上,我们可以通过二维数组的方法来定义存储幻方。
2、本程序要输入多个测试集,可通过一位数组来存储,可通过查找算法在测试集中找出是否有你要的幻方。
【任务定义】通过对初始化的二维数组值的重新编排,用几个判断语句来实现幻方的输出。
三、数据结构的选择和概要设计1、采用一个子函数实现测试集的输入,并存储在数组中,同时定义一个数组指针,存储完成后返回指向该数组的指针。
2、采用另外一个子函数判断你要找的幻方是否在测试集中,形参为1中指向数组的指针和来自主函数中你要查找的幻方的阶数。
如果查找成功返回1,否则返回0;3、基本操作:int Input()操作结果:实现测试集的输入,并返回int Search(int *p,int m)操作结果:确定你要查找的幻方是否在测试集中,如果在返回1,否则返回0;Void main()操作结果:主函数,实现你要幻方的阶数的输入,同时实现幻方初始化后数据的重新编排,使之成为幻方并输出。
4、核心程序的算法奇数阶幻方的构造方法很简单,我们先来看一个三阶幻方。
各数在方阵中的位置可以这样确定:首先把1放在最上一行正中间的方格中,然后把下一个整数放置到右上方,如果到达最上一行,下一个整数放在最后一行,就好像它在第一行的上面,如果到达最右端,则下一整数放在最左端,就好像它在最右一列的右侧,当到达的方格中已填上数值时,下一个整数就放在刚填上数码的方格的正下方。
魔方阵算法的设计与实现

二维数组的应用
魔方阵算法的设计与实现
a[i][j]=1;
Think
Think2:螺旋方阵
1
2
3
4
5
6 7 8 9
18 19 20 21 22 17 28 29 30 23 16 27 26 25 24
15 14 13 12 11 10
Think3:塔型方阵
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 3 2 1
1 2 3 2 1
1 2 3 4
二维数 组存储 魔方阵
二维数组 中所有元 素初始化 为0
将1存放 在第一行 的中间 位置
依次将 2到25 存放进 数组
Flowchart
魔 方 阵 算 法 的 流 程 图
Programing
/* 以下依次将 2~25填充进二维数组,建立魔方阵 */ #include <stdio.h> for(i=0;i<N;i++) /*输出魔方阵 */ for(k=2;k<=N*N;k++) #define N 5 { for(j=0;j<N;j++) { m=i;/*记录上一个数的行下标*/ main( ) n=j;/* 记录上一个数的列下标 */ printf("%4d",a[i][j]); i=i-1; j=j+1; ; { int a[N][N],i,j,k printf("\n"); if(i<0) i=N-1; /*上一个数在 0行,则下一个数在第 N-1行*/ for(i=0;i<N;i++) /*初始化二维数组 */ j=0; 程序运行结果如下: /*上一个数在N-1列,则下一个数在第0列*/ } if(j>N-1) for(j=0;j<N;j++) if(a[i][j]!=0) { i=m+1; j=n;} /*若找到新的位置已经被占用 a[i][j]=0; 新数应放在上一个数的下方*/ a[i][j]=k;/* 将新数 k填进数组 */ i=0 ;j=N/2; /* 将1存放在第一行中间位置 */ }
《C语言程序》课程设计报告书-魔方阵程序设计

吉林工程技术师范学院《C语言程序》课程设计报告书设计题目:魔方阵程序设计专业:计算机科学与技术班级:1054学生姓名:学号:21指导教师:xx2011年1月信息工程学院摘要我的实验题目是对C语言程序设计——魔方阵的编写,主要的功能是实现每一行,每一列以及对角线的相加结果相同,而且每一个数字均不相等。
本次实验能够充分的考核我们对C语言的学习程度以及动手操作能力,对我们提高C语言的能力有极大的帮助,所以这次实验也是十分有必要的。
我的设计内容就是利用循环语句,以及判断条件等函数的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方阵进一步的了解掌握。
关键字:C语言魔方阵程序设计目录摘要................................................. 第1章概述 (1)第2章系统分析 (2)2.1 技术分析 (2)2.2 功能分析 (2)第3章总体设计与详细设计 (3)3.1 系统总体设计 (3)3.2 详细设计 (4)第4章编码实现 (6)4.1 数据输入部分代码设计 (6)4.2 运算部分代码设计 (6)4.3 输出部分代码设计 (7)第5章系统调试 (9)5.1 程序运行结果 (9)5.2 调试过程中的问题与对策 (10)第6章设计总结 (10)参考资料 (12)致谢 (12)附录:1 源代码 (13)2 附图 (14)第1章概述本次实验报告十分有意义,对巩固C语言的学习有很大的帮助。
作用:我的实验课题是魔方阵(魔方阵是一个奇数行列式方阵),主要是实现一行,一列,对角线的和都相等。
意义、帮助:1、能够熟练掌握if、if…else、if…else if语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句实现分支选择结构。
2、能够熟练掌握while语句和for语句格式及使用方法,掌握循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。
c语言魔方阵课程设计

c语言魔方阵课程设计一、课程目标知识目标:1. 理解魔方阵的概念,掌握其基本性质和特点;2. 学会使用C语言实现魔方阵的生成、显示和验证;3. 掌握魔方阵相关算法,如:奇数阶魔方阵的生成方法、行列、对角线求和等;4. 了解魔方阵在实际应用中的价值,如:数学游戏、密码学等。
技能目标:1. 能够运用C语言编写程序,生成指定阶数的魔方阵;2. 能够分析魔方阵算法的时间复杂度和空间复杂度;3. 能够运用所学知识解决魔方阵相关实际问题,提高编程能力;4. 能够通过魔方阵编程实践,培养解决问题的策略和逻辑思维能力。
情感态度价值观目标:1. 培养学生对C语言编程的兴趣,激发学习热情;2. 培养学生合作探究、积极参与的精神,增强团队协作能力;3. 培养学生勇于克服困难、面对挑战的信心,提高自主学习能力;4. 引导学生认识到编程在生活中的应用价值,激发学生创新意识和实践能力。
课程性质:本课程为C语言编程实践课程,旨在让学生通过魔方阵编程实践,巩固C语言知识,提高编程能力。
学生特点:学生具备一定的C语言基础,对编程有兴趣,但可能缺乏实际编程经验。
教学要求:注重理论与实践相结合,强调动手实践,培养学生编程思维和解决问题的能力。
通过本课程的学习,使学生能够将所学知识运用到实际编程中,提高编程水平。
二、教学内容1. 魔方阵基本概念与性质- 魔方阵的定义与特点- 魔方阵的数学性质:行列、对角线求和等2. C语言编程基础回顾- 数据类型与变量- 控制结构:顺序、选择、循环- 数组的使用3. 魔方阵生成算法- 奇数阶魔方阵生成方法- 魔方阵生成程序的编写与调试4. 魔方阵显示与验证- 魔方阵的格式化输出- 验证魔方阵的正确性:行列、对角线求和检验5. 魔方阵编程实践- 编写生成指定阶数魔方阵的程序- 分析算法的时间复杂度和空间复杂度- 解决魔方阵相关实际问题6. 教学案例分析与讨论- 分析实际编程案例,总结编程技巧- 讨论编程中遇到的问题及解决方法7. 创新思维与实践- 探讨魔方阵在其他领域的应用- 鼓励学生进行创新编程实践,提高编程能力教学内容安排与进度:1. 基本概念与性质(1课时)2. C语言编程基础回顾(1课时)3. 魔方阵生成算法(2课时)4. 魔方阵显示与验证(1课时)5. 魔方阵编程实践(2课时)6. 教学案例分析与讨论(1课时)7. 创新思维与实践(1课时)教材章节关联:本教学内容与教材中关于数组、循环控制结构、函数等章节相关,通过魔方阵编程实践,使学生将所学理论知识应用于实际问题中,提高编程能力。
数据结构 魔方阵

【完成题目2】魔方阵【问题描述】魔方阵是一个古老的智力问题,它要求在一个m*n的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示:(a)三阶魔方阵(b)五阶魔方阵【基本要求】1.输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出提示信息;2.实现魔方阵;3.输出魔方阵。
【算法设计】首先,输入一个数字m(0<m<100),则输出对应的m阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。
若输入数字m超出要求范围或数字m为偶数或数字m<0,则提醒用户输入错误,需重新输入m。
使用多维数组输出魔方阵。
输入形式:数字m(0<m<100)。
输出形式:以矩阵形式输出n(0<m<100)阶奇数魔方阵;【源代码】#include <iostream>using namespace std;int main(int argc, char* argv[]){int i,j,m,k;//i:行,j:列,m:阶数,k:矩阵int a[100][100];cout<<"请输入一个奇数m (0<m<100):";loop1: cin>>m; //loop:循环if(m%2==0||m<0||m>=100){cout<<"输入错误!请重新输入一个奇数n (0<m<100):";goto loop1;}i=0;j=m/2;for(k=1;k<=m*m;k++){a[i][j]=k;if(k%m==0)i++;//行数加1else{i=(i==0)?m-1:i-1;j=(j==m-1)?0:j+1;}}for(i=0;i<m;i++){for(j=0;j<m;j++){cout<<a[i][j]<<" ";}cout<<endl;}return 0;}【结果截图】【收获及体会】本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
奇数阶魔方阵算法分析

奇数阶魔方阵一、提出问题所谓“奇数阶魔方阵”是指n 为不小于3的奇数的魔方阵。
这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵。
例如:3阶、5阶和7阶的魔方阵如图3 – 4 所示。
294753618 ,92251811321191210222013641614752315812417 ,20112494031221234341322321444423324151345363425161453735261786462927189747382819101183930 图3 – 4 3阶5阶和7阶魔方阵容易知道,这三个魔方阵的魔方常数分别是15、65和175。
现在要求给出:能让计算机自动输出类似图3 – 4 所示的n 阶奇数魔方阵的算法,其中n 为任意给定的一个不小于3的奇数。
二、简单分析决定“奇数阶魔方阵”的关键是要按要求决定其方阵中的各个数字。
观察图3 – 4中的三个奇数阶魔方阵,不难发现:1.由于是正规魔方,故所填入的n 2个不同整数依次为1、2、3、…、n 2 ;2.各行、列和对角线上的数字虽各不相同,但其和却是相同的。
这表明,其魔方常数可由公式n ( n 2 + 1 ) / 2得到。
3.数字在阵列中的次序,并没有遵从阵列单元的行、列下标的顺序,但数字“1”却始终出现在阵列第一行的正中间位置,而数字“n 2”也始终出现在阵列第n 行的正中间位置,这说明阵列中的数字排列应该是有一定规律的。
通过对两个奇数阶魔方阵的简单分析,下面几个基本问题必须得到解决:◆ 奇数阶魔方阵中的数字有些什么规律?◆ 数字“1”的位置应如何确定?三、设计准备1.奇数阶魔方阵中的数字规律通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:(1)自然数1出现在第一行的正中间;(2)若填入的数字在第一行(不在第n 列),则下一个数字在第n 行(最后一行)且列数加1(列数右移一列);(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;(4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1);(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。
数据结构课程设计论文

数据结构数据结构课程设计(论文)题目魔方阵作者杨政冬院系信息工程学院专业信息管理与信息系统学号 1314210140 指导老师安强强答辩时间摘要我的实验题目是利用数据结构相关算法来设计——魔方阵,主要的功能是实现每一行,每一列以及对角线的相加结果相同,而且每一个数字均不相等。
本次实验能够充分的考核我们对数据结构相关算法以及C语言的学习程度、动手操作能力有极大的帮助,所以本次课程设计是十分有必要的。
我的设计内容就是利用幻方算法(劳伯法、斯特拉兹法、罗伯法、海尔法)循环语句,以及判断条件等函数的合理使用,通过不断的运行,调试,输出,对本程序进行合理的解决,对魔方阵进一步的了解掌握。
关键字:算法、C语言魔方阵程序设计AbstractMy experiment topic is the use of data structure algorithms to design - the magic square, the main function is to implement each row, every column, and diagonal together in the same result, and each number are not equal.This experiment can fully conducted by our algorithms for data structure and the degree of learning C language is of great help, hands-on ability, so the curriculum design is very necessary.My design content is to use magic square algorithm (rob, stern raz, rob, haier) loop, and the judgment function, such as the condition of reasonable use, through continuous running, debugging, output, the reasonable solution to the program, the magic square to further grasp.Key words: magic square algorithm, C language program design1 绪论计算机是随着社会的发展应运而生,它贯穿了人们生活的方方面面。
ACM题——精选推荐

(2)奇数阶魔方Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 538 Accepted Submission(s): 311Problem Description一个n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方。
n为奇数时我们有1种构造方法,叫做“右上方”,例如下面给出n=3,5,7时的魔方.38 1 63 5 74 9 2517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9730 39 48 1 10 19 2838 47 7 9 18 27 2946 6 8 17 26 35 375 14 16 25 34 36 4513 15 24 33 42 44 421 23 32 41 43 3 1222 31 40 49 2 11 20第1行中间的数总是1,最后1行中间的数是n^2,他的右边是2,从这三个魔方,你可看出“右上方”是何意。
Input包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。
Output对于每组数据,输出n阶魔方,每个数占4格,右对齐Sample Input235Sample Output8 1 63 5 74 9 217 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9(5)毕业bgTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2967 Accepted Submission(s): 1086Problem Description每年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为“bg”。
实验报告魔方阵程序(3篇)

第1篇一、实验目的1. 熟悉Python编程语言的基本语法和常用数据结构。
2. 学习使用嵌套循环实现复杂数据结构的构建。
3. 掌握随机数生成和排序算法在程序中的应用。
4. 提高编程能力和问题解决能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本实验旨在设计一个魔方阵程序,实现以下功能:1. 生成一个nn的魔方阵。
2. 魔方阵中,每一行的数字之和等于n。
3. 魔方阵中,每一列的数字之和等于n。
4. 魔方阵中,对角线的数字之和等于n。
四、实验步骤1. 导入所需的库```pythonimport random```2. 定义一个函数,用于生成nn的魔方阵```pythondef generate_magic_square(n):初始化一个nn的二维数组,用于存储魔方阵的数字 magic_square = [[0] n for _ in range(n)]num = 1 用于存储当前要填充的数字i, j = 0, n // 2 初始化起始位置while num <= n n:将数字num填充到当前位置magic_square[i][j] = numnum += 1判断下一个位置new_i, new_j = (i - 1) % n, (j + 1) % n 如果当前位置已被填充,则移动到新位置if magic_square[new_i][new_j] != 0:i, j = (i + 1) % n, jelse:i, j = new_i, new_jreturn magic_square```3. 定义一个函数,用于检查魔方阵是否正确```pythondef check_magic_square(magic_square, n):检查每一行的数字之和是否等于nfor i in range(n):if sum(magic_square[i]) != n:return False检查每一列的数字之和是否等于nfor j in range(n):if sum(magic_square[i][j] for i in range(n)) != n:return False检查对角线的数字之和是否等于nif sum(magic_square[i][i] for i in range(n)) != n or sum(magic_square[i][n - i - 1] for i in range(n)) != n:return Falsereturn True```4. 主函数```pythondef main():n = int(input("请输入魔方阵的阶数:"))magic_square = generate_magic_square(n)if check_magic_square(magic_square, n):for row in magic_square:print(' '.join(map(str, row)))else:print("生成的魔方阵不正确!")```5. 运行程序```pythonif __name__ == "__main__":main()```五、实验结果当输入阶数n为5时,程序输出如下魔方阵:```1 2 3 4 512 13 14 15 1011 16 17 18 196 7 8 9 205 4 3 2 1```六、实验总结通过本次实验,我们成功设计并实现了一个魔方阵程序。
c语言魔方阵课程设计

c语言魔方阵课程设计一、教学目标本课程的目标是让学生掌握C语言编程基础,学会使用C语言编写魔方阵,并培养学生的逻辑思维能力和编程实践能力。
具体目标如下:1.知识目标:–掌握C语言的基本语法和数据类型。
–学会使用C语言进行条件判断和循环控制。
–理解函数的定义和调用。
–学习魔方阵的生成原理和算法。
2.技能目标:–能够使用C语言编写简单的程序。
–学会使用C语言编写魔方阵程序。
–培养学生的编程实践能力和问题解决能力。
3.情感态度价值观目标:–培养学生的学习兴趣和主动性。
–培养学生的团队合作意识和沟通能力。
–培养学生的创新思维和自我探索精神。
二、教学内容本课程的教学内容主要包括C语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用,以及魔方阵的生成原理和算法。
具体安排如下:1.C语言的基本语法和数据类型:介绍C语言的基本语法规则,包括变量声明、数据类型、运算符、表达式等。
2.条件判断和循环控制:介绍条件语句(if-else)和循环语句(for、while)的使用,以及它们的嵌套和应用。
3.函数的定义和调用:介绍函数的定义、声明和调用方式,以及函数的参数传递和返回值。
4.魔方阵的生成原理和算法:介绍魔方阵的定义和生成原理,以及常用的魔方阵生成算法。
三、教学方法本课程的教学方法采用讲授法、案例分析法和实验法相结合的方式。
具体方法如下:1.讲授法:通过教师的讲解和演示,让学生掌握C语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用等知识。
2.案例分析法:通过分析具体的魔方阵案例,让学生理解魔方阵的生成原理和算法,并学会使用C语言编写魔方阵程序。
3.实验法:通过编程实验,让学生亲自动手编写程序,培养学生的编程实践能力和问题解决能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
具体资源如下:1.教材:选用《C程序设计语言》作为主要教材,介绍C语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用等内容。
输出魔方阵

for(j=0;j<n;j++)a[n][i]+=a[j][i];
for(i=0;i<n;i++)a[n][n]+=a[i][i];//主对角线的和
}
void main()
{
int n;
int a[M][M]={0};
printf("魔方阵的阶数n=");//n为大于2的任意整数
}
}
//三、当n为单偶数(n=4k+2)时,可把方阵分为4个2k+1的小方阵,编号如下:
//1.各小方阵按奇数阶算法依次填入A(1…[2k+1]2)、B([2k+1]2+1…2[2k+1]2)、C(…)、D(…4[2k+1]2);
//2.将A与D换:A中间格始向右取k格;A最左边的k列(除中行);
//3.将C与B互换:从C的中间列开始向左数k-1列。
MagicOdd(a,0,m,2*m*m+1,m);//C阵(右上)
MagicOdd(a,m,0,3*m*m+1,m);//D阵(左下)
for(j=k;j<m-1;j++){//从A的中间格开始向右数k格...
t=a[k][j];
a[k][j]=a[k+m][j];//...与D对应位置交换
a[k+m][j]=t;
}
void MagicSev(int a[M][M],int st,int n)//单偶4k+2阶魔方阵,起始数st
{
int m=n/2,k=m/2;//将原矩阵分为2×2的方阵
数据结构课程设计奇偶魔方阵

1 引言本课程设计主要解决一个古老的智力问题。
它要求在一个n*n矩阵中填入1到n*n 数字(由于只是奇数的话,过于简单,因此,我不限定n),使得每一行、每一列、每条对角线的累加和都相等。
输入x,要求打印由自然数1到n*n构成的魔方阵。
1.1课程设计目的本课程设计是建立在数据结构这门课程基础上,数据结构是计算机及相关专业基础课,也是计算机及相关专业考研和水平等级考试的必考科目。
它所讨论的知识内容和提倡的技术方法,无论对进一步学习计算机领域的其他课程,还是对从事软件工程的开发,都有着不可代替的作用。
为了适应21世纪人才培养的需要,理论知识与实践训练相结合,培养动手能力,是课程设计的最终目的,通过实际项目的分析、设计、编码、测试等工作,掌握用C++语言来开发和维护软件;按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档。
1.2课程设计内容就本课程设计而言,程序设计的结构是为了体现数据结构的思想与内容,在正文第二节设计思路与方案中算法设计的描述,通过自然语言来详尽地梗概魔方阵的实现过程,同时,会在第三节中用程序设计语言(C++语言)[1] [2] [3]书写的算法语句和解释来详细描述魔方阵实现进程,算法描述后是运行环境与运行结果,通过调试来完善算法,达到最终要求。
最后是本人的结束语,其中有本课程设计的技术总结,并附带参考文献与程序设计的源代码,便于读者查看。
2 设计思路与方案。
2.1 设计思路(1)当n为奇数时,即n=2*m+1时,算法为:首先,把1填在第一行的正中间。
其次,若数k填在第i行第j列的格子中,那么k+1应填在它的左上方,即i-1,j-1;如果左上方没有格子,若i-1=0,那么k+1填在第n行第j-1列的格子中;若j-1=0,那么k+1填在第i-1行第n列的格子中;若i-1=0,j-1=0,那么k+1填在第n行第n列的格子中。
再次,若按上述方法找到的格子都已经填过了数,那么,数k+1填在第k个数的正下方。
C++实例奇数阶魔方阵问题

奇数阶魔⽅阵是指由1到n2(n为奇数)个⾃然数构成的n*n的⽅阵,它的每⼀⾏,每⼀列,和对⾓线各元素之和均相等,3阶的魔⽅阵如下: 8 1 6 3 5 7 4 9 2 n阶魔⽅阵的构造⽅法为: 1> ⾸先把1放在顶⾏的正中间,然后把后继数按顺序放置在右上斜的对⾓线上; 2> 当到达顶⾏时,下⼀个数放到底⾏,好像它在顶⾏的上⾯; 3> 当到达最右列时,下⼀个数放在最左端列,好像它仅靠在右端列的右⽅; 4> 当到达的位置已经填好数时,考试⼤提⽰:或到达右上⾓的位置时,下⼀个数就放在刚填写的位置的正下⽅。
C++函数如下: /*奇数阶魔⽅阵问题*/ #include using namespace std; const int MAX=50; void main() { int matrix[MAX][MAX]; int count; int row; int column; int order; cout<<"请输⼊阶数:"; cin>>order; if(order%2==0) { cout<<"阶数必须是⼀个奇数,请重新输⼊!"< } else { row=0; column=order/2; for(count=1;count<=order*order;count++) { matrix[row][column] = count; if (count % order == 0) { row++; } else { row = (row == 0) ? order - 1 : row - 1; column = (column == order-1) ? 0 : column + 1; } } for (row = 0; row < order; row++) { for (column = 0; column < order; column++) { cout<<"\t"< } cout< } } } 程序运⾏打印出相应的n阶魔⽅阵.。
c课课程设计魔方阵

c课课程设计魔方阵一、教学目标本课程的教学目标是使学生掌握魔方阵的相关知识,包括魔方阵的定义、性质、构造方法和应用。
学生应能够运用魔方阵解决实际问题,并培养对数学的兴趣和思维能力。
具体目标如下:1.知识目标:学生能够理解魔方阵的基本概念,掌握魔方阵的构造方法,了解魔方阵在实际问题中的应用。
2.技能目标:学生能够运用魔方阵解决线性方程组和二元一次方程组,提高数学解题能力。
3.情感态度价值观目标:学生通过学习魔方阵,培养对数学的兴趣,激发探索数学问题的热情,培养合作交流和解决问题的能力。
二、教学内容本课程的教学内容主要包括魔方阵的定义、性质、构造方法和应用。
具体内容包括:1.魔方阵的基本概念:介绍魔方阵的定义、特点和命名规则。
2.魔方阵的构造方法:讲解如何构造魔方阵,包括基本方法和相关技巧。
3.魔方阵的应用:介绍魔方阵在数学问题中的应用,如解决线性方程组和二元一次方程组。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
具体方法如下:1.讲授法:通过讲解魔方阵的基本概念、性质和构造方法,使学生掌握相关知识。
2.讨论法:学生进行小组讨论,分享各自对魔方阵的理解和应用经验。
3.案例分析法:分析具体案例,使学生了解魔方阵在实际问题中的应用。
4.实验法:引导学生动手操作,实际构造魔方阵,提高学生的实践能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选用权威、实用的教材,为学生提供系统、全面的学习材料。
2.参考书:提供相关参考书籍,帮助学生深入理解魔方阵的知识。
3.多媒体资料:制作精美的PPT和教学视频,直观展示魔方阵的构造方法和应用。
4.实验设备:准备相应的实验设备,让学生亲自动手操作,提高实践能力。
五、教学评估本课程的评估方式将包括平时表现、作业和考试等,以全面、客观地评估学生的学习成果。
一个2n(n为奇数)阶魔方阵的简单解法

定是 15; 在直的方向, 仍然是維持每擴增兩
列, 和就增加 5 的情形。 所以, 我們最後所形
成的 Θ′, 是一個橫列方向和等於 15 , 而直
欄方向和等於 5n的矩陣。
接下來, 讓我們討論步驟 (五) 的 Θ′′。
在直欄的方向, 仍然是維持每擴增兩列,
就增加 5的情形, 所以, 直欄方向的和等於
1. 前言
魔方陣 (magic square), 又被稱做是 「幻方」, 在中國古時候的 「洛書」 中, 它則被 稱做是 「縱橫圖」[1]。 魔方陣的條件是:
將 {1, 2, · · · , n2 − 1, n2} 排 列在一個 n × n 維的矩陣中, 讓 每一橫列、 每一縱欄與兩條對角線 的數字和, 都相等。
1234 5678 9 10 11 12 13 14 15 16
1 15 14 4 12 6 7 9 ⇒ 8 10 11 5 13 3 2 16
上面所介紹的兩種解法, 只是眾多解 法中, 被認為最簡單的兩種方法, 它們 的證明過程也是相當的容易, 只要使用類 似梁培基與張航輔 在 「 4k 階全對稱幻方的 一種快速構作方法」[3] 該篇文章的證明方法 即可。
(6) 1213431343 4342421212 1213134343 434242 1212 121313 4343
替代方陣 (3)。
一個 2n ( n 為奇數) 階魔方陣的簡單解法 73
我們再將擴展後的方陣 (5) 與方陣 (6)
重疊相加, 就得到橫、 直、 對角方向的和, 皆
是
100×(100+1) 2
是 Brualdi, R. A. 所寫的 『Introductory Combainatorics』[2]。
C语言魔方阵的三种实现方法

C语⾔魔⽅阵的三种实现⽅法⽬录魔⽅阵:1.奇数阶魔⽅阵2.偶数阶魔⽅阵(n=4K)3.偶数阶魔⽅阵(n=4K+2)魔⽅阵:把1到n*n排成n⾏n列⽅阵,使⽅阵中的每⼀⾏、每⼀列以及对⾓线上的数之和都相同,即为n阶魔⽅阵。
根据魔⽅阵的规律,我将它分为三种情况。
1.奇数阶魔⽅阵规律:第⼀个数放在第⼀⾏的中间,下⼀个数放在上⼀个数的上⼀⾏下⼀列,若该位置已经有了数字即放在上个数的下⾯⼀⾏的相同列⽤C语⾔编程如下:⽰例:n=5;#include<stdio.h>#include<stdlib.h>#include<assert.h>void Magic1(){#define ROW 5#define COL ROWassert(ROW % 2 != 0); //判断n是否为奇数int arr[ROW][COL] = { 0 }; //定义⼆维数组int currow = 0;int curcol = COL / 2;arr[currow][curcol] = 1;for (int i = 2; i <= ROW * COL; i++){if (arr[(currow - 1 + ROW) % ROW][(curcol + 1) % COL] == 0) //按照规律赋值{currow = (currow - 1 + ROW) % ROW;curcol = (curcol + 1) % COL;}else{currow = (currow + 1) % ROW;}arr[currow][curcol] = i;}for (int i = 0; i < ROW; i++) //打印魔⽅阵{for (int j = 0; j < COL; j++){printf("%-3d", arr[i][j]);}printf("\n");}}int main(){Magic1();return 0;}结果:2.偶数阶魔⽅阵(n=4K)规律:按数字从⼩到⼤,即1,2,3……n顺序对魔⽅阵从左到右,从上到下进⾏填充;将魔⽅阵分成若⼲个4×4⼦⽅阵(如:8阶魔⽅阵可分成四个4×4⼦⽅阵),将⼦⽅阵对⾓线上的元素取出;将取出的元素按从⼤到⼩的顺序依次填充到n×n⽅阵的空缺处。
数据结构实验三——魔方阵

教师签字:
6 1 8
7 5 3
2 9 4
是否再次进行魔方阵运算,是按1,否按0
四、界面设计
五、运行测试与分析
输入
输出
实际
3
6 1 8
7 5 3
2 9 4
√
5
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
√
7
28 19 10 1 48 39 30
29 27 18 9 7 47 38
37 35 26 17 8 6 46
45 36 34 25 16 14 5
4 44 42 33 24 15 13
12 3 43 41 32 23 21
20 11 2 49 40 31 22
√ห้องสมุดไป่ตู้
六、实验收获与思考
该试验做起来比较轻松,数据结构就是顺序的数组,每个数分三类情况去填,收获算是给自己增加了信心吧,然后写程序的速度有所提升。
实验报告三
实验课名称:数据结构与程序设计实验
实验名称:魔方阵
班级:
学号:
姓名:
时间:
一、问题描述
要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等
二、数据结构设计
本实验采用的数据结构是数组,直接顺序存储魔方阵的数
三、算法设计
请输入矩阵阶数m(m必须为奇数):3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
长沙理工大学《数据结构》课程设计报告田晓辉学院计算机与通信工程专业计算机科学与技术班级计08-01 学号************学生姓名田晓辉指导教师陈倩诒课程成绩完成日期2010年7月10日课程设计成绩评定学院计算机与通信工程专业计算机科学与技术班级计08-01学号200850080110 学生姓名田晓辉指导教师陈倩诒完成日期2010年7月10日指导教师对学生在课程设计中的评价指导教师对课程设计的评定意见课程设计任务书计算机与通信工程学院计算机科学技术专业用C语言解决魔方阵的问题学生姓名:田晓辉指导老师:陈倩诒摘要本课程设计主要解决设计一个n×n的矩阵中填入1到n2的数字(n为奇数),使得每一行、每一列、每条对角线的累加和都相等的问题。
在课程设计中,系统开发平台为Windows 7,程序设计语言采用Visual C++6.0,程序运行平台为Windows 98/2000/XP/7。
在程序设计中,采用了C 语言结构化程序设计思想和过程设计方法,以功能函数为基本结构,对问题中的要求做出了准确的实现。
程序通过调试运行,初步实现了设计目标。
关键词程序设计;C++6.0;结构化;过程设计;功能函数目录1.引言 (1)1.1课程设计目的 (1)1.2课程设计内容 (1)2.设计思路与方案 (2)3.详细实现 (3)3.1数据结构与数据存储表示 (3)3.2功能函数 (3)3.3函数逻辑功能调用图 (5)3.4本程序执行流程图 (6)4.运行环境与结果 (7)4.1程序运行环境 (7)4.2程序运行结果 (7)5.结束语 (9)参考文献 (10)附录源程序代码 (11)1 引言本课程设计主要解决设计一个n×n的方阵中填入1到n2(n为奇数)的数字,使得每一行、每一列、每条对角线上各个数字累加的和都相等的问题。
1.1 课程设计目的通过这次课程设计进一步了解了二维数组的使用方法和一些基本的设计思路。
对于一个n×n的方阵,其中n为奇数,在n×n的魔方阵中,填入1到n2的整数,使得其各每一行、每一列、每条对角线上各个数字累加和皆相等[1]。
1.2 课程设计内容本次课程设计内容主要是利用二维数组输出正确的n阶魔方矩阵。
n阶魔方,又叫幻方阵,在我国古代称为“纵横图”,是一个比较有趣的游戏。
[2]n阶魔方就是用1到n2的数字不重复的填入方阵中。
每一行中n个数之和,共得n个和;每一列中n个数之和,共得n个和;每一条对角线n个数之和,共得两个和,每一个和称为魔数。
魔方阵中的每个魔数都相等。
如图1.2就是一个3阶魔方阵,它是用数字1到9不重复的填入3*3的方阵中,使得各行、各列及对角线的魔数都等于15。
[3]6 1 87 5 32 9 4图1.1 3阶魔方阵2 设计思路与方案首先,输入一个数字n(1≤n≤99),则输出对应的n阶魔方阵,并输出每一行、每一列、每条对角线上各个数字累加和。
若输入数字n超出要求范围,则提醒用户重新输入n。
但若输入数字0时,操作结束,退出程序。
使用多维数组输出魔方阵,分别用3个子函数实现相应的功能。
输入形式:数字n(1≤n≤99)。
输出形式:(1)以矩阵形式输出n(1≤n≤99)阶魔方阵;(2)输出每一行、每一列、每条对角线上各个数字累加和;(3)输出程序运行时间。
3 详细实现3.1 数据结构与数据存储表示这方面使用二维数组n[MAX][MAX]来静态存储不超过MAX行MAX列的数组方阵,其中n(1<=n<=99)为满足条件的数。
3.2 功能函数主要使用与实现如下函数:(1)void main()函数,主函数,调用以下子函数,实现魔方阵填充与输出,实现问题要求功能;(2)#include<time.h>函数,用以计算程序运行时间函数;(3)void jishu(int n)函数,n为奇数实现n阶魔方阵,实现思想如下;a.在1到n2的数字中,选择1开始填充魔方,将数字1填入第一行的中间方格中,即(0,n/2)的位置。
b.向已填充的前一个数字位置(p,q)的左上角(p-1,q-1)填入下一个数字,如果出现以下情况,则修改填充位置:i)若填充位置超出上边界,则修改为下边界的相应位置,即把p-1修改为n-1;ii)若填充位置超出左边界,则修改为最右边的相应位置,即把q-1改为n-1;iii)若填充位置已有数字,则填充位置修改为下一行的同一位置。
c.重复以上步骤,直至将n2个数字全部填入魔方中。
最后调用函数函数out(n,a)和check (n,a),实现魔方阵的输出,检验魔方阵的准确性。
具体实现代码如下:void jishu(int n)/*奇数*/{int p,q,i,a[MAX][MAX];p=0;q=(n-1)/2;a[0][q]=1;/*第一个数字的填入位置*/for(i=2;i<=n*n;i++){p=(p-1+n)%n;/*计算填入的位置*/q=(q-1+n)%n;if(a[p][q]>0)/*如果填入位置已有数字,则重新计算填入位置*/{p=(p+2)%n;/*由于前面p减了1,因此p应该加1,才能表示下一行*/q=(q+1)%n;/*由于前面q减了1,因此q应该加1,才能表示同一列*/ }a[p][q]=i;/*填入数字*/}out(n,a);/*调用输出函数*/check(n,a);/*调用验证函数*/}(4)void out(int n,int a[MAX][MAX])函数,此函数用以调整方阵元素位置,实现魔方阵n*n形式输出。
具体实现代码如下:void out(int n,int a[MAX][MAX])/*魔方矩阵输出函数*/{int p,q;for(p=0;p<=n-1;p++){for(q=0;q<=n-1;q++){cout<<setw(4)<<a[p][q]<<"";/*输出魔方矩阵的结果*/}cout<<endl<<endl;}}(5)void check(int n,int a[MAX][MAX])函数,计算并输出n阶魔方阵每行、每列以及每条对角线上各个数字的累加和,同时验证魔方阵的准确性。
具体实现代码如下:void check(int n,int a[MAX][MAX])/*魔方矩阵验证函数*/{int p,q,sum1=0,sum2=(n*n+1)*n/2,k;cout<<"此魔方阵的每行、每列、两条对角线的和为:"<<sum2<<endl;/*输出标准魔方阵的每行、每列、两条对角线的和*/for(p=0;p<n;p++){for(q=0;q<n;q++){sum1=a[p][q]+sum1;/*计算矩阵横行纵行的和*/}if(sum1!=sum2)/*判断矩阵横行纵行的和是否与标准相同*/{cout<<"横行纵行计算结果与标准不符,请修改程序错误"<<endl;break;}sum1=0;}for(k=0;k<n;k++){sum1=a[k][k]+sum1;/*计算矩阵主对角线的和*/}if(sum1!=sum2)/*判断矩阵主对角线的和是否与标准相同*/cout<<"主对角线计算结果与标准不符,请修改程序错误"<<endl;sum1=0;for(k=0;k<n;k++){sum1=a[k][n-k-1]+sum1;/*计算矩阵次对角线的和*/}if(sum1!=sum2)/*判断矩阵次对角线的和是否与标准相同*/cout<<"次对角线计算结果与标准不符,请修改程序错误"<<endl;}3.3 函数逻辑功能调用图3.4 程序执行流程图图3.2 程序流程图void main()void jishu(int n) out(n,a)check(n,a) 开始输入nn 在允许 的范围内调用jishu (int n )调用out (n ,a ) 调用check (n ,a )输出n 阶魔方阵每行、每列以及每条对角线上各数字的累加和结束NY4 运行环境与结果4.1程序运行环境:Windows 7系统,VC++ 6.0开发平台。
4.2 程序运行结果(1)运行程序,根据提示输入指令,当n=3时,程序运行结果如图4.2.1所示图4.1 n=阶魔方阵(2)当n=6时即n为偶数时,程序运行结果如图4.2.2所示图4.2 n=6阶魔方阵(3) 当输入n=101即n超出所给范围1到99时,运行结果如图4.2.3所示图4.3 n=101阶魔方阵(4) 当输入n=0时,程序运行结束,运行结果如图4.2.4所示图4.4 n=0程序结束5 结束语本次课程设计我选择了一个古老的书序趣味问题——魔方阵,通过我的努力与探索,终于解决了奇数阶魔方阵的算法——左上斜行法。
在编程实现的过程中,我进一步掌握和熟悉了而为数组的应用,并熟悉了将问题分解在组装的解决方法和函数的调用。
编程过程中,使用另外完成输出功能的子函数void out(int n,int a),通过对其调用,大大节省了程序编写的复杂度,提高了效率。
在实现奇数阶魔方阵时,遇到了一点问题,请教了同学,一起进行了讨论研究,最终解决了问题。
通过这次课程设计,使我们学到了一些以前没有学过的知识,使我们对程序设计有了更深层次的认识和理解,懂得了灵活运用。
最后,由衷的向我的指导老师表示衷心的感谢,是她的指导和要求,才使我的课程设计有了较为完善的一面,才有了我能力的提高,并使我得到了充分的锻炼,同时也感谢我的同学,是他们帮助我解决了一些问题。
最后预祝陈老师以及我的同学暑假快乐!!!参考文献[1]黎明志.数据结构—用C语言描述.北京:中国水利水电出版社,2006,1[2]ice7733.魔方阵(magic square).人教论坛,/thread-161512-1-1.html,2010,7,7[3]winice82.谁对魔方阵感兴趣.Csdn,/t/20020528/22/760436.html,2010,7,7附录源程序代码// 程序名称:MAGIC.c// 程序功能:输出魔方阵// 程序作者:田晓辉// 最后修改日期:2010-7-8#include<iostream.h>#include<iomanip.h>#include<time.h>#define MAX 99/*矩阵最大为99*99*/void jishu(int n);void out(int n,int a[MAX][MAX]);/*魔方矩阵输出函数*/void check(int n,int a[MAX][MAX]);/*魔方矩阵验证函数*/void main(){clock_t start,end;int n;while(n!=0)/*判断输出的数n是否为0*/{cout<<"************************************************************************"<< endl;cout<<"*本程序用于输出1到99阶魔方阵,即将1到n平方的数填入n*n(n为奇数)的方阵中*"<<endl;cout<<"* 使所有的横行,纵行以及对角线上所有数字之和相等*"<<endl;cout<<"* 当输入0时本程序结束*"<<endl;cout<<"************************************************************************"<< endl;cout<<endl<<"请输入所输出的魔方阶数:";cin>>n;while(n<1||n>99){if(n==0)break;/*n=0 本程序结束*/cout<<"超出范围,请重新输入:";cin>>n;}if(n==0)break;/*n=0,本程序结束*/cout<<"所得的魔方阵为:"<<endl;start=clock();jishu(n);end=clock();cout<<"所花费的时间为:"<<end-start<<"毫秒"<<endl;}cout<<"谢谢您的使用!"<<endl;}void jishu(int n)/*奇数*/{int p,q,i,a[MAX][MAX];p=0;q=(n-1)/2;a[0][q]=1;/*第一个数字的填入位置*/for(i=2;i<=n*n;i++){p=(p-1+n)%n;/*计算填入的位置*/q=(q-1+n)%n;if(a[p][q]>0)/*如果填入位置已有数字,则重新计算填入位置*/{p=(p+2)%n;/*由于前面p减了1,因此p应该加1,才能表示下一行*/q=(q+1)%n;/*由于前面q减了1,因此q应该加1,才能表示同一列*/ }a[p][q]=i;/*填入数字*/}out(n,a);/*调用输出函数*/check(n,a);/*调用验证函数*/}void out(int n,int a[MAX][MAX])/*魔方矩阵输出函数*/{int p,q;for(p=0;p<=n-1;p++){for(q=0;q<=n-1;q++){cout<<setw(4)<<a[p][q]<<"";/*输出魔方矩阵的结果*/}cout<<endl<<endl;}}void check(int n,int a[MAX][MAX])/*魔方矩阵验证函数*/{int p,q,sum1=0,sum2=(n*n+1)*n/2,k;cout<<"此魔方阵的每行、每列、两条对角线的和为:"<<sum2<<endl;/*输出标准魔方阵的每行、每列、两条对角线的和*/for(p=0;p<n;p++){for(q=0;q<n;q++){sum1=a[p][q]+sum1;/*计算矩阵横行纵行的和*/}if(sum1!=sum2)/*判断矩阵横行纵行的和是否与标准相同*/{cout<<"横行纵行计算结果与标准不符,请修改程序错误"<<endl;break;}sum1=0;}for(k=0;k<n;k++){sum1=a[k][k]+sum1;/*计算矩阵主对角线的和*/}if(sum1!=sum2)/*判断矩阵主对角线的和是否与标准相同*/cout<<"主对角线计算结果与标准不符,请修改程序错误"<<endl; sum1=0;for(k=0;k<n;k++){sum1=a[k][n-k-1]+sum1;/*计算矩阵次对角线的和*/}if(sum1!=sum2)/*判断矩阵次对角线的和是否与标准相同*/cout<<"次对角线计算结果与标准不符,请修改程序错误"<<endl;}。