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