简单有趣的算法——魔方阵

所谓魔方阵,指的是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
++;
}
}
}

输出结果:

原文地址:https://www.cnblogs.com/unsigned/p/1758333.html