回复 19楼 yxiangyxiang
也是一种解法,不错。

梅尚程荀
马谭杨奚
程序代码:#include<stdio.h>
#include<malloc.h>
void sx(int m,int *p)
{
int i,*q;
for(i=0;i<m/2;i++)
{
int k=0;
while(k<(m-2*i))
{
*(p+m*i+i+k)=i+1;
k++;
};
k=0;
while(i>0&&k<i)
{
*(p+m*i+k)=k+1;
*(p+m*(i+1)-1-k)=k+1;
k++;
}
}
q=p+m*m-1;
while(p<q)
*q--=*p++;
}
void sy(int m,int *p)
{
int i,*q;
for(i=0;i<(m+1)/2;i++)
{
int k=0;
while(k<(m-2*i))
{
*(p+m*i+i+k)=i+1;
k++;
};
k=0;
while(i>0&&k<i)
{
*(p+m*i+k)=k+1;
*(p+m*(i+1)-1-k)=k+1;
k++;
}
}
q=p+m*m-1;
while(p+m<q)
*q--=*p++;
}
void main()
{
int i,j,m;
int **s,*p;
printf("输入矩阵边长\n");
scanf_s("%d",&m);
s=(int**)malloc(sizeof(int*)*m);
s[0]=(int *)malloc(m*m*sizeof(int));
p=s[0];
for(i=1;i<m;i++)
s[i]=s[0]+i*m;
if(m%2==0)
sx(m,p);
else
sy(m,p);
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
printf("%3d",s[i][j]);
printf("\n");
}
free(s);
}