A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qddnovo 中级黑马   /  2014-6-8 16:27  /  2933 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

 要求输出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. void f(int x);

  5. int main()
  6. {
  7.     int x;

  8.     scanf("%d", &x);
  9.     f(x);

  10.     return 0;
  11. }

  12. void f(int x)
  13. {
  14.     int i, m, n;
  15.     int **mf;
  16.    
  17.     mf = (int **)malloc(sizeof(int *) * x);              //定义动态二维数组mf

  18.     for(i = 0; i < x; i++)
  19.     {
  20.         mf[i] = (int *)malloc(sizeof(int) * x);
  21.         memset(mf[i], 0, sizeof(int) * x);                   //初始化,将二维数组mf所有元素赋值为0
  22.     }

  23.     m = 0;
  24.     n = x / 2;
  25.     mf[m][n] = 1;

  26.     for(i = 2; i <= x * x; i++)
  27.     {
  28.         m--;
  29.         n++;

  30.         if(m < 0)       //如果是在第一行,行数变为最后一行,列数加1
  31.         {
  32.             m = x - 1;
  33.         }
  34.    
  35.         if(n > x - 1)    //如果是在最后一列,行数减1,列数为第1行
  36.         {
  37.             n = 0;
  38.         }
  39.             
  40.         if(mf[m][n] != 0)               //如果后续的数所处位置已有数,则行数加1,列数不变
  41.             m++;

  42.         mf[m][n] = i;
  43.     }

  44.     for(m = 0; m < x; m++)
  45.     {
  46.         for(n = 0; n < x; n++)
  47.         {
  48.             printf("%5d", mf[m][n]);
  49.         }

  50.         printf("\n");   
  51.     }

  52.     for(i = 0; i < x; i++)         //释放占用的内存
  53.     {
  54.         free(mf[i]);
  55.         mf[i] = 0;
  56.     }

  57.     free(mf);      
  58.     mf = 0;
  59. }
复制代码

4 个回复

倒序浏览
看起来很腻害的样子
回复 使用道具 举报
徐开伟 发表于 2014-6-10 10:21
看起来很腻害的样子

一起学习{:3_64:}
回复 使用道具 举报
高手哟
回复 使用道具 举报
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马