#include<stdio.h>
#define MAX 25
int a[MAX][MAX]={0};
void snake_matrix(int n)
{
int i,j,k,m,r; //m为从1-n按顺序要存入数组的数,r是为了暂存数据用的
i=j=k=0; //i,j为控制数组a下标的,k:比如说k为偶数,则从a[k][0]开始把m存入,是奇数则从a[0][k]开始把m存入
for(k=0,m=1;k*k<n+1;k++)
{
if(k%2==0) //k为偶数
{
i=k;
j=0;
r=m;
while(m<=r+k&&m!=n+1) //从a[k][0]开始向右存入m
a[i][j++]=m++;
m--;
r=m;
j--;
while(m<=r+k&&m!=n+1) //从a[k][k]开始向上存入m
a[i--][j]=m++;
}
else
{
i=0;
j=k;
r=m;
while(m<=r+k&&m!=n+1) //从a[0][k]开始向下存入m
a[i++][j]=m++;
m--;
r=m;
i--;
while(m<=r+k&&m!=n+1) //从a[k][k]开始向左存入m
a[i][j--]=m++;
}
}
}
void print(int n) //打印输出
{
int i,j,k;
for(i=k=0;i<=MAX;i++)
{
for(j=0;j<=MAX;j++)
if(a[i][j]!=0) //如果是0不输出
printf("%-4d",a[i][j]);
else if((i+1)*(i+1)>n&&i*i<n) //如果最后一行前面有0,则用空格代替,比如输入98时,最后一行是0,0,99,98……
printf(" ");
else
break; //其它情况跳出循环
printf("\n");
if((i+1)*(i+1)>n) //如果最后一行输出完毕,就结束循环……
break;
}
}
void main()
{
int n;
printf("n:");
scanf("%d",&n); //输入蛇形矩阵的长度,为了正常显示,n应小于400
snake_matrix(n); //生成长度为n的蛇形矩阵
print(n); //输出生成蛇形矩阵
}