奇数阶魔方阵

发布 2022-07-19 10:45:28 阅读 9885

魔方阵。

问题描述。魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1~m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示。

图1 五阶魔方阵示例。

基本要求。 输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息。

实现魔方阵。

输出魔方阵。

实现提示。本实验使用的数据结构是数组。

解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。

由1开始填数,将1放在第0行的中间位置。

将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:

左上角超出上方边界,则在最下边相对应的位置填入下一个数字;

左上角超出左边边界,则在最右边相应的位置填入下一个数字;

如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。

以3×3魔方阵为例,说明其填数过程,如图2所示。

图2 三阶魔方阵的生成过程。

由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m。所以,位置(x,y)的左上角的位置可以用求模的方法获得,即:

x=(x-1+m)%m

y=(y-1+m)%m

如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。这里需要注意的是。此时的x和y已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即:

x=(x+2)%m

y=(y+1)%m

程序如下:#include

#include

using namespace std;

template

class matrix: public vector< vector >

public:

matrix(int m = 0, int n = 0, const t& v = t())

vector< vector >(m, vector(n, v))

int rows() const

int cols() const

template

ostream& operator<<(ostream& os, const matrix& m)

for (int i = 0; i < i)

return os;

void magicsquare(int n)

matrix m(n, n);

int n2 = n * n;

int k = 1;

int x = 0, y = n / 2;

m[x][y] =k++;

while (k <=n2)

m[x][y] =k++;

cout <

int main(int argc, char* ar**)

magicsquare(5);

return 0;