供参考:
#include <stdio.h>
int a[100][100];
void func(int n)
{
int x = 0, y = -1, x_inc = 0, y_inc = 1;//x,y表示当前数组要赋值的位置,x_inc每次赋值时,x和y的增量
int num = n, num_inc = n; //num:移动方向发生变化的转变点,num_inc:每次转变时num的增量
for (int i = 1; i <= n * n; ++i)
{
x += x_inc;
y += y_inc;
a[x][y] = i;
if (i == num) //每次移动方向发生改变的判断条件
{
if (y_inc == 1 || y_inc == -1) //横向变纵向
{
x_inc = y_inc;
y_inc = 0;
num_inc--;
num += num_inc; //下一次变向的终点
}
else //纵向变横向
{
y_inc = -x_inc;
x_inc = 0;
num += num_inc;
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
func(n);
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
printf("%3d ", a[i][j]);
printf("\n");
}
return 0;
}