数据结构 第5章 魔方阵

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

数据结构

实验报告第五章

实验名称:魔方阵

实验类型:设计性实验

班级:

学号:

姓名:

实验日期:2014年6月7日

1.问题描述

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

基本要求

●输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判

断,如m有错,能给出适当的提示信息。

●实现魔方阵。

●输出魔方阵。

2.数据结构设计

这个问题的数据结构使用数组就可以解决。

3.算法设计

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

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

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

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

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

一个数字。

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

图2 三阶魔方阵的生成过程

由三阶魔方阵的生成过程可知,某一位置(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

4.运行、测试与分析

(1)程序开始运行并输入。

(2)输出结果。

(3)容错检验。

(4)测试其他数据。

5.实验收获及思考

遇到的问题:

输出结果不正确。

解决办法:

因为程序较短,通过肉眼观察程序,发现是数组下标表示错误,一时大意把n维数组的下标范围误认为从1到n,经过修改后,输出结果正常。

实验的收获:

这次试验体会到了解决问题时算法的重要性,一个良好的解法可以使程序大大简化。

附录:

#include

#include

#include

using namespace std;

int main()

{

int m;//m是魔方阵的行数

int n=1;//用来递增给每个位置赋值

int x,y;//i是行数,j是列数 cout<<"输入魔方阵的行数:";

while(1)

{

cout<<"输入魔方阵的行数。";

cin>>m;

if(!(m>=1&&m%2==1)) //检验行数是否是奇数{cout<<"输入有误!请输入正奇数。"; exit(-2);} int shuzu[m][m]; //建立魔方阵,并且全部元素为0 for(int i=0;i

{

for(int j=0;j

{

shuzu[i][j]=0;

}

}

x=0;

y=(m-1)/2;

shuzu[x][y]=n++;

while(1)

{

x=(x-1+m)%m; //左上移动

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

if(!(shuzu[x][y]==0))

{

x=(x+2)%m;

y=(y+1)%m;

}

shuzu[x][y]=n++;

if(n==m*m+1) break;

}

for(int i=0;i

{

for(int j=0;j

{

cout<

}

cout<

}

}

return 0;

}

相关文档
最新文档