描述
n阶魔方阶是有n * n个数,将1到n平方的整数填进方镇,使行列对角线的数字之和相等
例如,三阶
8 1 6
3 5 7
4 9 2
和为15
算法
数字1:放入0行中间
安置数字:情况一(正常时)上一数字i-1,j+1
情况二(arr[i-1][j+1]已经有数字了)撤销上一步操作,换成i+1,j不变
越界下标的处理:(以三阶为例):
-1——>2 3——>0
流程图(不大标准,见谅)
代码
//C语言
#include <stdio.h>
int main()
{ //i表示行数,j表示列数
const int N = 5;
int a[N][N] = { 0 };
int i = 0, j = N/2;
int m = 2, t1, t2,originm=2; //t1,t2用于辅助下标过界的情况
a[0][N/2] = 1; //m和originm用于标记下标从哪种情况出来
while (m <= N*N) {
if (m == originm) { //正常情况下标计算范围
t1 = i;
t2 = j;
i--;
j++;
}
else { //另一路径是的下标计算
i = t1;
j = t2;
i++;
t1 = i;
t2 = j;
}
while (1) { //此处为当下标超出范围时
if (i >= 0 && i < N && j >= 0 && j < N) {
break;
}
else {
if (i == N)i = 0;
else if (i == -1)i = N-1;
if (j == N)j = 0;
else if (j == -1)j = N-1;
break;
}
}
while (1) {
if (a[i][j] == 0) {
a[i][j] = m; //填数操作:当目标空为0时
m++; //这种情况的标记是m=originm
originm = m;
break;
}
else {
originm--; //此时目标空不为0,标记是m!=originm
break;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) { //打印输出
printf("%d\t", a[i][j]);
}
printf("\n");
}
printf("\n");
//按行和列求一下和
for (int i = 0; i < N; i++) {
int sum = 0;
for (int j = 0; j < N; j++) {
sum += a[i][j];
}
printf("第%d行的和为%d\n", i, sum);
}
printf("\n");
for (int j = 0; j < N; j++) {
int sum = 0;
for (int i = 0; i < N; i++) {
sum += a[i][j];
}
printf("第%d列的和为%d\n", j, sum);
}
return 0;
}