zoukankan      html  css  js  c++  java
  • 简单有趣的算法——魔方阵

    所谓魔方阵,指的是1~n*n共n*n个自然数,排列成nXn的方阵,使得该方阵的每行、每列、对角线元素之和相等,并为只与n有关的常数,该常数为(1/2)nX(nXn+1)。

    假定阵列的行列下标都从1开始,则魔方阵的生成方法如下:

    1.在第1行中间置1;

    2.假定当前元素的下标为(i,j),则对其余的2~n*n个数,基本的放置位置为当前位置的右上方,即下标为(i-1,j+1)。与此同时,若当前的数是n的倍数,则放在当前位置的正下方,即下标为(i+1,j);若i-1小于1,则将这个数放在本列的最下端;若j+1大于n,则将这个数放在本行的最左端。

    #include "stdafx.h"

    #include
    <malloc.h>
    #include
    <stdlib.h>

    void Array(int n);

    void main()
    {
    int n;
    printf(
    "Set n,please:\n");
    scanf(
    "%d",&n);
    Array(n);

    system(
    "PAUSE");
    }

    void Array(int n)
    {
    int i, j, no, num, max;
    int*mtrx;

    if (n %2==0)
    {
    n
    = n +1;
    }

    max
    = n * n;

    /*C数组时基于0的*/
    mtrx
    = (int*)malloc(max);

    mtrx[n
    /2] =1;
    i
    =0;
    j
    = n /2;

    for (num =2; num <= max; num ++)
    {
    i
    = i -1;
    j
    = j +1;
    if ((num -1) % n ==0)
    {
    i
    = i +2;
    j
    = j -1;
    }
    if (i <0)
    {
    i
    = n -1;
    }

    if(j > n -1)
    {
    j
    =0;
    }

    no
    = i * n + j;

    mtrx[no]
    = num;
    }

    /*显示魔阵的元素*/
    printf(
    "The charming matrix is :");
    no
    =0;
    for (i =0; i < n; i ++)
    {
    printf(
    "\n");
    for(j =0; j < n; j ++)
    {
    printf(
    "%3d",mtrx[no]);
    no
    ++;
    }
    }
    }

    输出结果:

  • 相关阅读:
    bzoj 2832
    洛谷5月月赛
    P4705 玩游戏
    【bzoj4817】[Sdoi2017]树点涂色&&bzoj3779-重组病毒
    A
    P4715 「英语」Z 语言
    P4714 「数学」约数个数和
    P2860 [USACO06JAN]冗余路径Redundant Paths
    【BZOJ3252】攻略
    BZOJ 1706
  • 原文地址:https://www.cnblogs.com/unsigned/p/1758333.html
Copyright © 2011-2022 走看看