魔方阵,古代又称“纵横图”,是指组成元素为自然数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;
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved