理论基础
#include <stdio.h>
# define ROW 5
void MAGIC(int M[ROW][ROW],int n){
int i, j, num;
i = 0;
j = n/2;
for (num = 1;num<=n*n; num++) {
//printf("(i,j) = (%d,%d)\n",i,j);
if(M[i][j] == 0){
M[i][j] = num;
}else{
i+=2;
M[i][--j] = num;
}
if(i==0&&j==n-1){
i++;
}else if(i==0){
i=n-1;j++;
}else if(j==n-1){
i--;j=0;
}else{
i--;j++;
}
}
}
int main(){
int n = ROW;
int i,j;
int M[ROW][ROW];
for (i=0; i<n; i++){
for (j=0; j<n; j++){
M[i][j] = 0; // 清0 //
printf("%4d",M[i][j]);
}
printf("\n");
}
MAGIC(M,n);
for (i=0; i<ROW; i++){
for (j=0; j<ROW; j++){
printf("%4d",M[i][j]);
}
printf("\n");
}
return 0;
}
程序利用define行数来改变魔方大小,然后注释掉的一行语句可以用来追踪数字的位置变化情况。