• 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("
    ");    
    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

  • 相关阅读:
    每日总结3.8
    Go中定时器实现原理及源码解析
    Go语言实现布谷鸟过滤器
    详解Go语言调度循环源码实现
    Go语言中时间轮的实现
    详解Go语言I/O多路复用netpoller模型
    详解Go中内存分配源码实现
    Go中由WaitGroup引发对内存对齐思考
    【分享】java精品实战教程
    nginx实战教程
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3753952.html
Copyright © 2020-2023  润新知