n阶魔方阵(奇数阵)的输出

需求  

  要求输出1~n²的自然数构成的魔方阵。

STEP 1 什么是魔方阵?

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

STEP 2 魔方阵的规律是什么?

  此处先写简单一点的奇阶魔方阵,偶数阶的算法更复杂,暂不讨论。

  奇阶魔方阵的排列方法:

  ⑴将1放在第一行中间一列;

  ⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1;

  ⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);

  ⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1;

  ⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。

STEP 3 编程思路

  ⑴构造一个n阶魔方阵雏形,即n*n的动态二维数组;

  ⑵编写函数实现魔方阵的排列算法;

  ⑶调用函数输出魔方阵。

STEP 4 要点整理

  malloc函数:分配内存空间给动态数组(使用后需在函数最后用free语句释放所占用的内存)

  memset函数:给数组的所有元素赋初值

 

-----------------------------------------华丽丽的分割线---------------------------------代码君要出场了-----------------------------------

 

 1 #include <stdio.h>

 2 #include <stdlib.h>

 3 #include <string.h>

 4 

 5 void f(int x);  6 

 7 int main()  8 {  9     int x; 10 

11     scanf("%d", &x); 12  f(x); 13 

14     return 0; 15 } 16 

17 void f(int x) 18 { 19     int i, m, n; 20     int **mf; 21     

22     mf = (int **)malloc(sizeof(int *) * x);              //定义动态二维数组mf

23 

24     for(i = 0; i < x; i++) 25  { 26         mf[i] = (int *)malloc(sizeof(int) * x); 27         memset(mf[i], 0, sizeof(int) * x);                   //初始化,将二维数组mf所有元素赋值为0

28  } 29 

30     m = 0; 31     n = x / 2; 32     mf[m][n] = 1; 33 

34     for(i = 2; i <= x * x; i++) 35  { 36         m--; 37         n++; 38 

39         if(m < 0)       //如果是在第一行,行数变为最后一行,列数加1 

40  { 41             m = x - 1; 42  } 43     

44         if(n > x - 1)    //如果是在最后一列,行数减1,列数为第1行

45  { 46             n = 0; 47  } 48             

49         if(mf[m][n] != 0)               //如果后续的数所处位置已有数,则行数加1,列数不变

50             m++; 51 

52         mf[m][n] = i; 53  } 54 

55     for(m = 0; m < x; m++) 56  { 57         for(n = 0; n < x; n++) 58  { 59             printf("%5d", mf[m][n]); 60  } 61 

62         printf("\n"); 63  } 64 

65     for(i = 0; i < x; i++)         //释放占用的内存

66  { 67  free(mf[i]); 68         mf[i] = 0; 69  } 70 

71  free(mf); 72     mf = 0; 73 }

 

欢迎转载,请备注原始连接http://www.cnblogs.com/liuliuliu/p/3753952.html,并注明转载。

作者bibibi_liuliu,联系方式[email protected]

你可能感兴趣的:(魔方)