数据结构实验报告魔方阵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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");