魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。
比如:
输入:3
输出:
6 1 8 上一个数i=0 下一个数i=n-1 j--
7 5 3 上一个数j=n-1 下一个数j=0 i--
2 9 4 i++;
(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1/减1(例如上面的三阶魔方阵,5在4的上一行后一列);
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为1时,下一个数的列数应为n,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
#include <stdio.h>
#include<string.h>
int main(int argc,const char *argv[])
{
int a[19][19]={};
int n;
scanf("%d", &n);
if (!(n%2) || n>19 || n<3) {
return -1;
}
int k=1;
int i=0,j=n/2;
int tempi,tempj;//保存上一次的位置
while (k<=n*n) {
a[i][j]=k;
tempi =i;
tempj =j;
i--;
j--;
if (tempi==0) {
i=n-1;
}
if (tempj==0) {
j=n-1;
}
if (a[i][j]) {
i=tempi+1;
j=tempj;
}
k++;
}
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}