魔方阵 实验报告

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

<< 魔方阵>>实验报告

一.实验目的

1.设计数据结构;

2.设计算法完成任意n阶魔方阵的填数;

3.分析算法的时间复杂度。

二.实验内容

魔方阵,又叫幻方阵,在我国古代称为“纵横图”。它是在一个n*n的矩阵中填入1到n*n的数字(n为奇数),使得每一行,每一列,每条对角线的累加和都相等。

三.程序代码

源程序:

#include

void Square(int n)

{ int a[9][9];

int p=0, q=(n-1)/2;

a[0][q]=1; //在第0行的中间位置填1

for (int i=2; i<=n*n; i++)

{

p=(p-1+n) % n; //求i所在行号

q=(q-1+n) % n; //求i所在列号

if (a[p][q]>0)

{

p=(p+2)%n; q=(q+1)%n; //这两句进行了修改,否者得不到正确的答案,切记切记!!!!

}//如果位置(p, q)已经有数,填入同一列下一行

a[p][q]=i;

}

for(p=0; p

{for(q=0; q

cout<

cout<<'\n';}

}

void main()

{

int n;

cout<<"请输入魔方矩阵的阶数n=(n为奇数且<=9):";

cin>>n;

cout<<"魔方阵的排列结果为:\n";

Square(n);

}

四.结果与心得体会

1.程序的测试结果是什么?

答:n=3时

n=5时

2.在调试的过程中遇到了什么问题,是如何解决的?

答:在调试的过程中遇到了以下几个问题:

1.Square函数的形式参数不可以是(int a[][], int n),因为程序是在编

译时就会为数组分配内存,而那样的形式参数是不合理的。在调试程

序的过程中,我反复试了好多次,也证明了那是错的。

解决方法:直接将Square函数的形参设为(int n),改在在其函数内定义数组a[9][9],这样就能将问题很好的解决。

2. 在书中提供的Square函数里面,有一个语句是这样的if(a[p][q]>0)

p=(p+1)%n; ,这个语句是错的。之所以会有这样的错误,是由

于错误的理解了“如果位置(p, q)已经有数,填入同一列下一行”这一句

的意思,这句的意思是填入原数的下面,而不是即将填入的那个数但又

已填入数的那个数的下面。

解决方法:将该语句改成:

if (a[p][q]>0)

{ p=(p+2)%n; q=(q+1)%n;

}

,这样就可以了。

3. 由于数组a[][]是在Square函数中定义的,因此将数组数据输出的语句

就只能放在Square函数中实现。

相关文档
最新文档