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,联系方式395985239@qq.com
posted on 2014-05-26 21:39 bibibi_liuliu 阅读(2913) 评论(7) 编辑 收藏 举报