龙空技术网

什么是魔方阵?强大的C/C++(附源码)!

专业技术交流 114

前言:

当前各位老铁们对“各列元素之和相等”大约比较注重,兄弟们都需要了解一些“各列元素之和相等”的相关资讯。那么小编在网上搜集了一些关于“各列元素之和相等””的相关文章,希望看官们能喜欢,咱们一起来了解一下吧!

魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。

简介魔方阵:

⒈何谓矩阵?矩阵就是由方程组的系数及常数所构成的方阵。把用在解线性方程组上既方便,又直观。

⒉何谓n阶方阵?若一个矩阵是由n个横列与n个纵行所构成,共有n*n个小方格,则称这个方阵是一个n阶方阵。

⒊何谓魔方阵? 4 9 2 3 5 7 8 1 6定义:由n*n个数字所组成的n阶方阵,具有各对角线,各横列与纵行的数字和都相等的性质,称为魔方阵。而这个相等的和称为魔术数字。若填入的数字是从1到n*n,称此种魔方阵为n阶正规魔方阵。

⒋最早的魔方阵相传古时为了帮助治水专家大禹统治天下,由水中浮出两只庞大动物背上各负有一图,只有大禹才可指挥其中之由龙马负出的为河图,出自黄河;另一由理龟负出的洛书出自洛河。洛书

⒌最早的四阶魔方阵相传是刻在印度一所庙宇石上,年代大约是十一世纪。古代印度人十分崇拜这种幻方,至今从古神殿的遗址,墓碑上常常还可以发现四阶幻方的遗迹。

⒍欧洲最早的魔方阵是公元1514年德国画家Albrecht Dure在他著名的铜板画Melencolia上的4×4幻方,有趣的是,他连创造年代(1514)也镶在这个方阵中,而且上下左右,四个小方阵的和皆为34,是欧洲最古老的幻方。

魔方阵排列方法:

如3×3的魔方阵:

8 1 6

3 5 7

4 9 2

魔方阵的排列规律如下:

⑴将1放在第一行中间一列;

⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);

⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;

⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;

⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

效果如图所示:魔方阵

魔方阵

源码:

#include<iostream>

#define N 5

#define N1 8

using namespace std;

//奇数魔方阵

int main(void) {

int i, j, key;

int square[N + 1][N + 1] = { 0 };

i = 0;

j = (N + 1) / 2;//将魔方阵第一行中间一列赋值为0.

for (int key = 1; key <=N*N; key++)

{

if ((key%N)==1)//判断1-n*n,中多少个除以N余1,则说明行数多少。

{

i++;

}

else//从第一行中间开始行数减一,列数加一。

{

i--;

j++;

}

if (i==0)//如果下一行行数为0,这说明下面无行数,将行数设置为当前行数为N,因为从1开始的

{

i = N;

}

if (j>N)//如果下一列大于阶数n,说明当前阶数为1。

{

j = 1;

}

square[i][j] = key;

}

int sum1 = 0;

for (int i = 1; i <=N; i++)

{

for (int j = 1; j <=N; j++)

{

cout << setw(3) << square[i][j];

sum1 = sum1 + square[i][j];

}

cout << endl;

}

cout << sum1 << endl;

sum1 = 0; int sum3 = 0;

for (int i = 1; i <=N; i++)

{

sum1 = sum1 + square[i][i];//主对角线求和

sum3 = sum3 + square[i][N - i + 1];//次对角线求和。

}

cout << sum1 << " "<<sum3<<endl;

int sum = (N*N + 1)*N / 2;//输出标准魔方阵的每行、每列、两条对角线求和。

cout << sum << endl;

解法图

//4N魔方方阵

int a[N1 + 1][N1 + 1] = { 0 };

for (int i = 1; i <=N1;i++)

{

for (int j = 1; j <= N1; j++) {

if ((i%4==j%4)||(i%4+j%4)==1)//对角线上数据

{

a[i][j] = (N1 + 1 - i)*N1 - j + 1;

}

else//非对角线上数据

{

a[i][j] = (i - 1)*N1 + j;

}

}

}

for (int i = 1; i <= N1; i++)

{

for (int j = 1; j <= N1; j++) {

cout << setw(3) << a[i][j];

}

cout << endl;

}

int c = 0;

for (int i = 1; i <=N1; i++)

{

c = c + a[i][i];

}

int b = (N1*N1 + 1)*N1 / 2;

cout << b <<" "<<c<< endl;

标签: #各列元素之和相等