zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3753952.html
Copyright © 2011-2022 走看看