魔方阵
1.将1放在第一行中间一列
2.从2直到N*N为止,每一个数存放的行比前一个数的行数减1,列数加1。
3.如果上一数的行数为1,则下一数的行数为N。
4.如果上一数的列数为 N,下一个数列数为1,行数减1。
5.如果已经有数,把这一个数放在有数的正下方。(行数加1列数不变)
#include<stdio.h>
#define N 5
int main(void){
int a[N][N];
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
a[i][j]=0;
int i=0;
int j=N/2;
a[0][j]=1;//first step:put 1 in the first line and middle
int m,n;
for(int k=2;k<=N*N;k++){
m=i-1;
n=j+1;
if(i==0){
m=N-1;
}
if(j==N-1){
n=0;
}
if(a[m][n]){
m=i+1;
n=j;
}
a[m][n]=k;
i=m;
j=n;
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++)
printf("%4d ",a[i][j]);
printf("\n");
}
}