回复 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); }