思路:将其分为4部分,按顺时针方向依次为A,B,C,D。A按照奇魔方的方式对其赋值
在A的基础上对B,C,D赋值
交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素(包括中间列)
对其他行,交换从左向右m列各对应元素。
交换B、D魔方元素,交换从中间列向左m-1列各对应元素(包括中间列)
/*
时间:2020/08/16
目的:输出魔方方阵之偶魔方(阶数不为4的倍数)
功能:对于二维数组的一些操作
*/
#include<stdio.h>
#define N 10
int main()
{
int a[N][N],i,j,num,k,t;
k=N/2;
j=(k-1)/2,i=0;
a[i][j]=1;
for(num=2;num<=k*k;num++){//赋值A魔方阵
if((num-1)%k==0)
i++;
else{
i--;
i=(i+k)%k;
j++;
j=j%k;
}
a[i][j]=num;
}
for(i=0;i<k;i++){//依次赋值B,C,D魔方阵
for(j=0;j<k;j++){
a[i][j+k]=a[i][j]+2*k*k;//对B赋值
a[i+k][j]=a[i][j]+3*k*k;//对C赋值
a[i+k][j+k]=a[i][j]+k*k;//对D赋值
}
}
for(i=0;i<k;i++){//交换A,C魔方阵的值
if(i==k/2){
for(j=k/2;j<k-1;j++){
t=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=t;
}
}
else{
for(j=0;j<(k-1)/2;j++){
t=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=a[i][j];
}
}
}
for(i=0;i<k;i++){//交换B,D的值
for(j=k+k/2;j>k+2;j--){
t=a[i][j];
a[i][j]=a[i+k][j];
a[i+k][j]=t;
}
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
printf("%5d",a[i][j]);
}
printf("\n");
}
return 0;
}
/*
总结:将其分为4部分,按顺时针方向依次为A,B,C,D。A按照奇魔方的方式对其赋值
在A的基础上对B,C,D赋值
交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素(包括中间列)
对其他行,交换从左向右m列各对应元素。
交换B、D魔方元素,交换从中间列向左m-1列各对应元素(包括中间列)
-----------------------
在dev中输出结果为
92 99 1 8 15 67 74 51 58 65
98 80 7 14 16 73 55 57 64 66
4 6 88 95 22 54 56 63 70 72
85 87 19 21 3 60 62 69 71 53
86 93 25 2 9 61 68 75 52 59
92 99 76 83 90 42 49 26 33 40
98 80 82 89 91 48 30 32 39 41
79 81 13 20 97 29 31 38 45 47
85 87 94 96 78 35 37 44 46 28
86 93 100 77 84 36 43 50 27 34 正确
-----------------------
*/