魔方阵

合集下载

魔方阵算法及C语言实现

魔方阵算法及C语言实现

魔方阵算法及C语言实现1 魔方阵概念魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n = 3,4,5…。

魔方阵也称为幻方阵。

例如三阶魔方阵为:魔方阵有什么的规律呢?魔方阵分为奇幻方和偶幻方。

而偶幻方又分为是4的倍数(如4,8,12……)和不是4的倍数(如6,10,14……)两种。

下面分别进行介绍。

2 奇魔方的算法2.1 奇魔方的规律与算法奇魔方(阶数n = 2 * m + 1,m =1,2,3……)规律如下:1.数字1位于方阵中的第一行中间一列;2.数字a(1 < a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n;3.数字a(1 < a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为1;4.如果a-1是n的倍数,则a(1 < a ≤ n2)的行数比a-1行数大1,列数与a-1相同。

2.2 奇魔方算法的C语言实现1 #include <stdio.h> 2// Author: / 3// N为魔方阶数 4#define N 115 6int main()7{8int a[N][N]; 9int i;10 int col,row;1112 col = (N-1)/2;13 row = 0;1415a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19if((i-1)%N == 0 )20 {21 row++;22 }23else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829// if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row<N;row++)36 {37for(col = 0;col < N; col ++)38{39 printf("%6d",a[row][col]);40 }41printf("\n");42 }43return0;44 }3 偶魔方的算法偶魔方的情况比较特殊,分为阶数n = 4 * m(m =1,2,3……)的情况和阶数n = 4 * m + 2(m = 1,2,3……)情况两种。

魔方阵

魔方阵

问题3.1、n –魔方阵一、提出问题所谓“n – 魔方阵”是指由1至n 这n 个不同整数构成的魔方阵,其魔方常数为n ( n + 1 ) / 2。

例如,5 – 魔方阵和7 – 魔方阵如图3 – 1所示。

易知,这两个魔方阵的魔方常数分别为15和28。

3215415432432152154354321 ,4321765176543254321762176543654321732176547654321 图3 – 1 5 – 魔方阵和7 – 魔方阵n – 魔方阵的数字排列很有规律,若用人工的方法给出并不困难。

现在要求给出:能让计算机自动输出n (≥ 3)为奇数时形如图3 – 1所示的n – 魔方阵的算法。

二、简单分析n – 魔方阵较我们之后将要讨论的奇、偶数阶魔方阵,要简单许多。

观察后不难发现:1.要填入的n 个数字在阵列的每一行和每一列都要出现且仅出现一次,且各行(列)中的数字顺序相同,这里的顺序是指循环顺序,其中数字1接在数字n 的后面。

2.从阵列的行来看,每一行的第一个数字与它上一行正中间的数字相同。

通过对“n – 魔方阵”的分析,下面几个基本问题必须得到解决:◆ 如何确定阵列第一行各个数字?◆ 在填入其他行的数字时如何保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行正中间的数字?三、设计准备假设我们要构建的是一个n – 魔方阵,为此定义一个有n 行n 列的二维数组。

1.确定阵列第一行各个数字这里我们处理的方法很简单,即可以利用循环方法顺序地在二维数组第一行中填写1,2,3,…,n 这n 个自然数即可。

2.填入其他行的数字,并保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行正中间的数字要解决这个问题,需借助一个有n + 1单元的一维数组,并对该数组进行若干次“循环左移”处理。

所谓做一次“循环左移”,即指在一维数组中,将第1个数填入第n + 1个单元,第2个数填入第1个单元,……,第n个数填入第n– 1 个单元,最后再将第n + 1个单元中的数填入第n个单元。

11阶立方体魔方阵的制作及原理(精)

11阶立方体魔方阵的制作及原理(精)

11 階立方體魔方陣的製作及原理摘要:在這篇報告中,我們將0~1330中每一個正整數,先將每一個數都連續除以11兩次,再把每一個數的餘數以及商,分別取出來,再將每一個數都表示成a×112+b×11+c,其中a、b、c都是0~10的正整數,再將這些數轉化成座標形式(a、b、c),再利用等差數列的觀念,從原點分別向X軸、Y軸、Z軸增加一定的座標量,希望11 階立方體陣中,每一個平面上它們的橫線、直線、對角線,及立方體的四條對角線,他們的x座標、y座標及z座標0~10均只出現一次,如此一來,將這些座標換算回所對的數,會出現每一個面的直線、橫線、對角線及方體中四條對角線上面的數字總和相等的結果。

研究動機:在上學期學習「數量關係」,曾經提到一種以相同大小增加或減少的數列,老師提到可以用這種觀念來解釋平面上的魔方陣.在「有趣的魔方陣」這本書中,我們又看到了有關於魔方的各種製作方法及各式各樣的變形魔方,其中所介紹的立體方陣引起了我們的興趣,但是我們發現書本所記的立體方陣都只提到2階,3階或者12面體的立體方陣(見圖)的製作及結果,但是這本書的介紹僅限於此,並沒有再提到任何立體方陣的敘述,所以我們就想到了一個問題:”能不能用類似的手法創造一個與正方形魔方類似的立體方陣?”,也就是在它的格子中填入一些數字,使它裡面的每一面橫、直、對角線的總和均相等且立方體內的四條對角線總和也與前述相等,基於這項原因經過多次的實驗及推理觀察,我們將對11階的立方體進行觀察研究。

研究目的:發展一個製作11階立方體魔方的方法,使它能滿足研究動機中的結論,並推測是否還有其他立體方陣存在。

研究方法:根據85年度嘉義中小學科展作品「奇數階的製作及原理」我們以11階的平面魔方陣為例,重新觀察它的製作過程,現在我們的問題是:”將0-120的每一個正整數填入(如圖)11×11的正方形空格中,使它的直、橫、及對角線總和均相等”,面對這個問題,我們先將0-120的每個數都除以11,找出商及餘數,並表示成座標得到詳細結果如下:0÷11=0 ……0(0,0)1÷11=0……1(0,1)2÷11=0……2(0,2)3÷11=0 ……3(0,3)4÷11=0……4(0,4)5÷11=0……5(0,5)6÷11=0 ……6(0,6)7÷11=0……7(0,7)8÷11=0……8(0,8)9÷11=0 ……9(0,9)10÷11=0……10(0,10)11÷11=1……0(1,0)12÷11=1 ……1(1,1)13÷11=1……2(1,2)14÷11=1……3(1,3)15÷11=1 ……4(1,4)16÷11=1……5(1,5)17÷11=1……6(1,6)18÷11=1 ……7(1,7)19÷11=1……8(1,8)20÷11=1……9(1,9)21÷11=1 ……10(1,10)22÷11=2……0(2,0)23÷11=2……1(2,1)24÷11=2 ……2(2,2)25÷11=2……3(2,3)26÷11=2……4(2,4)27÷11=2 ……5(2,5)28÷11=2……6(2,6)29÷11=2……7(2,7)30÷11=2 ……8(2,8)31÷11=2……9(2,9)32÷11=2……10(2,10)33÷11=3 ……0(3,0)34÷11=3……1(3,1)35÷11=3……2(3,2)36÷11=3 ……3(3,3)37÷11=3……4(3,4)38÷11=3……5(3,5)39÷11=3 ……6(3,6)40÷11=3……7(3,7)41÷11=3……3(3,8)42÷11=3 ……9(3,9)43÷11=3……10(3,10)44÷11=4……0(4,0)45÷11=4 ……1(4,1)46÷11=4……2(4,2)47÷11=4……3(4,3)48÷11=4 ……4(4,4)49÷11=4……5(4,5)50÷11=4……6(4,6)51÷11=4 ……7(4,7)52÷11=4……8(4,8)53÷11=4……9(4,9)54÷11=4 ……10(4,10)55÷11=5……0(5,0)56÷11=5……1(5,1)57÷11=5 ……2(5,2)58÷11=5……3(5,3)59÷11=5……4(5,4)60÷11=5 ……5(5,5)61÷11=5……6(5,6)62÷11=5……7(5,7)63÷11=5 ……8(5,8)64÷11=5……9(5,9)65÷11=5……10(5,10)66÷11=6 ……0(6,0)67÷11=6……1(6,1)68÷11=6……2(6,2)69÷11=6 ……3(6,3)70÷11=6……4(6,4)71÷11=6……5(6,5)72÷11=6 ……6(6,6)73÷11=6……7(6,7)74÷11=6……8(6,8)75÷11=6 ……9(6,9)76÷11=6……10(6,10)77÷11=7……0(7,0)78÷11=7 ……1(7,1)79÷11=7……2(7,2)80÷11=7……3(7,3)81÷11=7 ……4(7,4)82÷11=7……5(7,5)83÷11=7……6(7,6)84÷11=7 ……7(7,7)85÷11=7……8(7,8)86÷11=7……9(7,9)87÷11=7 ……10(7,10)88÷11=8……0(8,0)89÷11=8……1(8,1)90÷11=8 ……2(8,2)91÷11=8……3(8,3)92÷11=8……4(8,4)93÷11=8 ……5(8,5)94÷11=8……6(8,6)95÷11=8……7(8,7)96÷11=8 ……8(8,8)97÷11=8……9(8,9)98÷11=8……10(8,10)99÷11=9 ……0(9,0)100÷11=9……1(9,1)101÷11=9……2(9,2)102÷11=9 ……3(9,3)103÷11=9……4(9,4)104÷11=9……5(9,5)105÷11=9 ……6(9,6)106÷11=9……7(9,7)107÷11=9……8(9,8)108÷11=9 ……9(9,9)109÷11=9……10(9,10)110÷11=10……0(10,0)111÷11=10 ……1(10,1)112÷11=10……2(10,2)113÷11=10……3(10,3)114÷11=10 ……4(10,4)115÷11=10……5(10,5)116÷11=10……6(10,6)117÷11=10 ……7(10,7)118÷11=10……8(10,8)119÷11=10……9(10,9)120÷11=10 ……10(10,10)現在我們想將這些數對填入空格中,而且我們希望能讓我們的橫、直、對角線的x座標及y座標總和均相等,我們所利用的方法如下:從左下角開始填入(0,0)分別向下每跳一格加上(1,1) ,(2,3)我們可先得到如下圖結果:因為(6,9)再加(2,3)得到(8,12),我們將12除以11取其餘數一可得座標(8,1)再將其向填入空格中,其餘的座標填法均如上所述,所以我們將所有座標填入後所得到下圖結果(見圖3)觀察上述結果,因為橫、直、對角線他們的x座標及y座標均從0-10出現一次,所以我們可以推測將座標還原成原先代表的數字能夠得到我們要的結論,還原的結果如下:上述方法的優點是:1.我們將原本相當多且複雜的數轉換成座標後,每一個座標所要考慮的對象都變少了(只要考慮0~10)2.因為從(0,0)向x軸、向y軸增加一定的座標。

魔方阵

魔方阵

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

如3×3的魔方阵:8 1 63 5 74 9 2魔方阵的排列规律如下:(1)将1放在第一行中间一列;(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。

例如2在第3行最后一列,则3应放在第二行第一列;(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;一、魔方阵的简介1.何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。

把用在解线性方程组上既方便,又直观。

2.何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有个小方格,则称这个方阵是一个n阶方阵。

3.何谓魔方阵?4 9 2 3 5 7 8 1 6定义:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵。

而这个相等的和称为魔术数字。

若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。

4.最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背上各负有一图,只有大禹才可指挥其中之由龙马负出的为河图,出自黄河;另一由理龟负出的洛书出自洛河。

洛书5.最早的四阶魔方阵最早的四阶方阵刻在印度一所庙宇石上,年代大约是十一世纪。

古代印度人十分崇拜这种幻方,至今从古神殿的遗址,墓碑上常常还可以发现四阶幻方的遗迹。

史上最难的文字游戏:四喜魔方阵

史上最难的文字游戏:四喜魔方阵

在8块腹肌上纹四喜魔方阵:)融合纹身文化+文字游戏:)奇思妙想来,四喜魔方阵。

阵法天然道,道里乾坤大。

最近琢磨出一个新想法,在八块腹肌上纹上四喜魔方阵,四喜魔方阵是超强的文运之气聚灵阵法,可以提升吸收文运之气及天地灵气的效率。

四喜魔方阵,需要纹上16个太古云文,虽然只有16字,但核心是史上最难的文字游戏,是的,没错,只有16字,但超级难,这16字,融合了数独的理念、回文、四声喜全递等,是全新的创意修仙之法,为了方便理解,用简体字来描述。

这16字,关联程度极大,因此纹好后,形成一个神秘的大循环,更容易与天地共鸣,更容易汲取不同次元的文运之气和灵气。

融合数独+回文+四声喜全递+嵌字等的四喜魔方阵,让大脑也做有氧体操,考验你的文字技巧,考验你的普通话,考验你的知识储备,考验你的国学底蕴,考验你的搜商能力,考验你的智慧、勇气和文气:)史上难度最大、最有趣的20关的四喜魔方阵,等你来打通关!16字的四喜魔方阵,累计20关,可构成20个四种声调全有的4字。

横着读+竖着读+斜着读+倒过来读(回文),16字的四喜魔方阵,累计可以构成20个四种声调全有的4字;为方面理解,我用16个英文字母摆了一个模型:ABCDEFGHIJKLMNOP从左往右,ABCD、EFGH、IJKL、MNOP等需要是四种声调全有的有内涵的四字,小计四组;从右往左,DCBA、HGFE、LKJI、PONM等需要是四种声调全有的四字,小计四组;从上往下,AEIM、BFJN、CGKO、DHLP等需要是四种声调全有的四字,小计四组;从下往上,MIEA、NJFB、OKGC、PLHD等需要是四种声调全有的四字,小计四组;斜着从上往下读,AFKP、DGJM等需要是四种声调全有的四字,小计两组;斜着从下往上读,MJGD、PKFA等需要是四种声调全有的四字,小计两组;这样累计下来,最多可构成20组四种声调全有的有内涵的四字。

例如ABCD位置是“平地起家”2431,倒过来念是“家起地平”1342,家起地平位于DCBA的位置,但家起地平这4字没有意义,家起地平不算合格的四种声调全有的有内涵的四字,平地起家是成语,平地起家是有效的。

c语言魔方阵课程设计

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课时)教材章节关联:本教学内容与教材中关于数组、循环控制结构、函数等章节相关,通过魔方阵编程实践,使学生将所学理论知识应用于实际问题中,提高编程能力。

实验报告魔方阵程序(3篇)

实验报告魔方阵程序(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语言编程基础,学会使用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语言的基本语法和数据类型、条件判断和循环控制、函数的定义和调用等内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
魔方阵
学生姓名:
专业:
班级:
学号:
指导教师:
2017年4月12日
目录
一、实验题目 (2)
二、实验目的 (2)
三、实验要求 (2)
四、实现过程 (3)
1、总体设计: (3)
2、详细设计: (5)
3、调试分析: (9)
4、运行结果: (9)
5、实验总结: (10)
五、参考文献 (10)
六、附录 (10)
一、实验题目
魔方阵
二、实验目的
本次课程设计的主要目的是综合运用所学的数据结构知识解决奇数魔方阵问题,侧重对二维数组等相关内容的综合应用,使自己能进一步熟悉掌握数据结构的基础知识,进一步提升自己的解决问题和编程调试能力,为后续专业课程的学习打下良好的基础。

三、实验要求
1.[问题描述]:
魔方阵时一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示:
2.[设计要求]:
(1)输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息
(2)实现魔方阵
(3)输出魔方阵
3.[数据结构]
本课程设计使用的数据结构是数组。

四、实现过程
1、总体设计:
1.主流程图:
2.填数流程图
2、详细设计:
1.奇数阶幻方(劳伯法)
填写的方法是:把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:
(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;
(5)如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

2.以3*3魔方阵为例,说明其填数过程,如下图:
(a)(b)(c)
(d)(e)(f)
(g)(h)(i)
由三阶魔方阵的生成过程可知,某一位置(i,j)的左上角的位置是(i-1,j-1),如果i-1≥0,不用调整,否则将调整i-1+size;同理,如果j-1≥0,不用调整,否则将其调整为j-1+size,所以位置(i,j)左上角位置可以用三元运算符获得,即:
row=i-1<0 ? size-1 : i-1
clum=j-1<0 ? size-1 : j-1
如果所求位置已经有数据了,将该数据填入同一列下一行的位置,即:if(square[row][cloum])
i++;
else
{
i=row;
j=cloum;
}
3.程序实现
(1)输入魔方阵阶数并判断
printf("请输入一个大于1的奇数:\n");
scanf("%d",&size);
while(size%2==0||size<3)
{
printf("输入错误,请重新输入:\n");
scanf("%d",&size);
}
(2)根据算法构造魔方阵
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
square[i][j]=0;
}
}
i=0;
j=(size-1)/2;
square[i][j]=1;
for(count=2;count<=size*size;count++)
{
row=i-1<0?(size-1):(i-1);
//cloum=j+1>=(size)?(0):(j+1);//右循环
cloum=j-1<0?(size-1):(j-1);//左循环
if(square[row][cloum])
{
i++;
}
else
{
i=row;
j=cloum;
}
square[i][j]=count;
}
(3)输出结果
printf("\n%d阶魔方阵为:\n",size);
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
printf(" %4d ",square[i][j]);
}
printf("\n\n");
}
3、调试分析:
程序的编写和调试基本正常。

遇到的问题主要是:矩阵的边界问题。

本实验采用二维数组,思路清晰,实验时调试顺利,各模块具有很好的可重用性,得到了一次良好的程序设计训练。

本实验算法是使用二维数组遍历,由于遍历第一层循环只是在遍历矩阵的第一维度,长度为n,遍历第二层循环是在遍历数组第一维度对应下标下的一维数组,长度为n,因此都要用O(n²)的时间。

4、运行结果:
(1)获取阶数并给出错误提示
(2)获取正确阶数并输出结果
5、实验总结:
本实验采用数据结构为二维数组,在使用过程中巩固了学习的知识,在用C语言实现魔方阵算法时对C语言的使用更加熟悉。

同时使我对数据结构又有了许多新的深刻认识,更深的理解了数据结构的难点,并且通过这次课程设计,我把以前认为没有实际用途的知识转化为了实际问题来解决,非常有意思,同时也觉得这种学习方法,更好的提高学习的效率。

五、参考文献
[1] 严蔚敏,吴伟民,《数据结构》,北京:清华大学出版社,2006年
[2]苏小红,《C语言程序设计》(第3版)2015年
六、附录
#include<stdio.h>
#define N 100
void main()
{
int i,j,row,cloum,size,square[N][N],count;
int p=1;
while(p==1)
{
printf("请输入一个大于1且小于100的奇数:\n");
scanf("%d",&size);
while(size%2==0||size<3||size>100)
{
printf("输入错误,请重新输入:\n");
scanf("%d",&size);
}
if((size!=0)&&(size<100)&&size%2!=0) p=1;
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
square[i][j]=0;
}
}
i=0;
j=(size-1)/2;
square[i][j]=1;
for(count=2;count<=size*size;count++) {
row=i-1<0?(size-1):(i-1);
//cloum=j+1>=(size)?(0):(j+1);//右循环cloum=j-1<0?(size-1):(j-1);//左循环
if(square[row][cloum])
{
i++;
}
else
{
i=row;
j=cloum;
}
square[i][j]=count;
}
printf("\n%d阶魔方阵为:\n",size);
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
printf(" %4d ",square[i][j]);
}
printf("\n\n");
}
}
}。

相关文档
最新文档