数据结构实验报告魔方阵

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

课程名称 数据结构与程序设计实验

课程编号 0906550

数据结构与程序设计实验

验 报 告

实验项目名称

学号

魔方阵

年级

姓名

专业

计算机科学与技术

学生所在学院

实验室名称地点

计算机学院

指导教师

21B276

杨静

哈尔滨工程大学

实验报告三

实验课名称:数据结构与程序设计实验

实验名称:魔方阵

班级学号姓名时间2016.04.14

一、问题描述

魔方阵是一个古老的智力问题,它要求在一个m ×m的矩阵中填入 1 ~m 的数字(m 为奇数),使得每一行、每一列、每条对角线的累加和都相等,如下图所示。

五阶魔方阵示例

15 8 1 24 17

16 14 7 5 23

22 20 13 6 4

3 21 29 12 10

9 2 25 18 11

二、数据结构设计

本实验使用二维数组作为数据结构

三、算法设计

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. 解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。

(1). 由1 开始填数,将 1 放在第0 行的中间位置。

(2). 将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:

a. 左上角超出上方边界,则在最下边相对应的位置填入下一个数字;

b. 左上角超出左边边界,则在最右边相应的位置填入下一个数字;

c. 如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。

(3). 以3 ×3魔方阵为例,说明其填数过程,如下图所示。

1

2 1

2

1

3

(a) (b) (c)

1 1 6 1

3 5 3 5 3

2

(d) 4 2

(e)

4 2

(f)

4

6 1 6 1 8 6 1 8

7 5 3 7 5 3 7 5 3

2 4 2 4 2 9 4

(g) (h) (i)

三阶魔方阵的生成过程

由三阶魔方阵的生成过程可知,某一位置(x,y) 的左上角的位置是(x-1,y-1), 如果x-1 ≥0,不用调整,否则将其调整为x-1+m ;同理,如果y-1 ≥0,不用调整,否则将其调整为y-1+m 。所以,位置(x,y) 的左上角的位置可以用求模的方法获得,即:

x=(x-1+m)%m

y=(y-1+m)%m

如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。这里需要注意的是。

此时的x 和y 已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x 需要跨越两行,y 需要跨越一列,即:

x=(x+2)%m

y=(y+1)%m

3. 程序实现

(1). 输入魔方阵阶数并判断

int n;

for(;;){

printf(" 请输入魔方阵的阶数(为奇数且大于0 小于100): ");

scanf("%d", &n);

if(n%2 != 0 && n > 0 && n < 100)

break;

else

printf(" 输入错误,请重新输入.\n");

}

(2). 根据算法构造魔方阵

int a[100][100];

for(int i=0;i

for(int j=0;j

a[i][j]==0;

int x=0,y=n/2;

a[x][y]=1;

for(int

k=2;k<=n*n;k++){ x=(x-

1+n)%n;

y=(y-1+n)%n;

if(a[x][y]==0)

a[x][y]=k;

else{

x=(x+2)%n;

y=(y+1)%n;

a[x][y]=k;

}

}

(3). 输出结果

for(int

i=0;i

t j=0;j

printf("%d\t",a[i][j]);

printf("\n");

}

四、界面设计

程序需要获取魔方阵的阶数(包括错误判断),输出结果,均在执行过程中给出提示。

五、运行测试与分析

1. 获取阶数并给出错误提示

2. 获取正确阶数,并输出结果

六、实验收获与思考

本次实验采用的数据结构为二维数组,在使用过程中巩固了学习的知识,在用 C 语言实现魔方阵算法时对 C 语言的使用更加熟悉。

七、附录(原程序)

#include

int main(){

int n;

for(;;){

printf(" 请输入魔方阵的阶数(为奇数且大于0 小于100): ");

scanf("%d", &n);

if(n%2 != 0 && n > 0 && n < 100)

break;

else

printf(" 输入错误,请重新输入.\n");

相关文档
最新文档