经典实验--输出魔方阵


·一、实验目的

  实验目的:练习多维数组的用法

·二、实验原理

  魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

魔方阵的排列方法

如3×3的魔方阵:

  8 1 6

  3 5 7

  4 9 2

  魔方阵的排列规律如下:

  (1)将1放在第一行中间一列;

  (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);

  (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

  (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

要求:从键盘上输入一奇数n(0

·三、主要数据结构和算法

1、算法分析

·四、实验结果及分析

1测试结果截图 

(1)第一组测试数据及结果截图

(2)第二组测试数据及结果截图

(3)第三组测试数据及结果截图

·五、心得体会

  认真分析题目,钻研思考规律,找符合相同的特点,

  总结寻找算法,然后根据算法编写程序,最后测试,看是否符合魔方阵的规律

·六、源文件

#include 
#define N 10
int main()
{
    int a[N][N]={0};
    int n,i,j,k,t,x,y;
    scanf("%d",&n);
    i=0;                      //第一个数的行
    j=n/2;                    //第一个数的列
    t=n-1;
    for(k=1;k<=n*n;k++)
    {
        a[i][j]=k;             //第一个数赋值  
        x=i;                 //保存x为新的行 
        y=j;                //保存y为新的列 
        if(i==0)
            i=t;            
        else
            i=i-1;              //非0行则取上一行 
        if(j!=t)
            j++;              //非最后列则取下一列 
        else
            j=0;             //当前数在最后一列,则下一个数在第一列
        if(a[i][j]!=0)
        {
            i=x+1;
            j=y;
        }
    }
    printf("%dde 魔方阵为:",n);
    for(i=0;i//依次输出魔方阵 
    {
        printf("\n");
        for(j=0;j)
        {
            printf("%3d",a[i][j]);
        }
     } 
     printf("\n");
 } 

相关