分析:依次将1到N2填入矩阵,填入方法如下:
1个元素放在第0行的中间一列。
下一个元素放在当前元素的上一行、下一列。
如上一行、下一列已经填好,则下一个元素的填入位置为当前列下一行。
在找上一行、下一行或下一列时,必须把矩阵看成是回绕的。也就是说,如果当前行是最后一行时,下一行为第0行;当前行是第0行时,上一行为最后一行;当前列是最后一列时,下一列为第0列。
#include <stdio.h>
#define MAX 15
int main( )
{
int i, row, col, n, a[MAX][MAX]={ 0 };
scanf("%d",&n);
row=0; col=(n-1)/2; a[row][col]=1; // 填入1
for (i=2;i<=n*n;i++) // 依次填入2至n×n
{ if ( a[(row-1+n)%n][(col+1)%n]==0 ) // 如果下一个位置未填数
{ row=(row-1+n)%n; // 计算下一个位置的行号
col=(col+1)%n; // 计算下一个位置的列号
}
else row=(row+1)%n; // 如果已填数,下一个位置为当前行的下一列
a[row][col]=i; // 填入i
}
for (row=0; row<n; row++)
{ for (col=0; col<n; col++)
printf("%4d",a[row][col]);
printf("\n");
}
}