PAT1050 螺旋矩阵

xiaoxiao2021-02-28  104

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

输入格式:

输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。

输入样例: 12 37 76 20 98 76 42 53 95 60 81 58 93 输出样例: 98 95 93 42 37 81 53 20 76 58 60 76 这个题非常综合,考试中估计是比较难拿满分的,特别是花矩阵的方法不是完全对称的画,会出现很多细节问题,思路已经写在代码注释中了 下面是AC代码 #include <stdio.h> #include <stdlib.h> #include <math.h> int cmp(const void *a,const void *b) //快排 { int *aa = (int *)a; int *bb = (int *)b; return *bb - *aa; } int main() { int N; int m,n,k=0; int tmp; scanf("%d",&N); int *a = (int *)malloc(sizeof(int)*N); int **s; int i,j,q; //得到 m,n m = sqrt(N); while(N % m != 0) { m++; } n = N / m; if(n > m) { tmp = m; m = n; n = tmp; } //为一个二维数组 s 动态分配内存 s=(int**)malloc(sizeof(int*)*(m+1)); for(i=0;i<m;i++) s[i]=(int*)malloc(sizeof(int)*(n+1)); //输入数字并且从大到小排序 for(i=0;i<N;i++) { scanf("%d",&a[i]); } qsort(a,N,sizeof(int),cmp); if(n == 1) //考虑特殊情况,只有一列时 { for(i=0;i<N;i++) printf("%d\n",a[i]); return 0; } for(i=0;k<N;i++) //开始画矩阵,这里的判断条件非常关键,是k<N,这样可以避免考虑很多繁琐的因素,只需要当数组a中的数全部赋到二维数组中就停止。 { for(j=i;j<n-i;j++) //矩阵是按顺时针一圈一圈往里画的,先画上边 { s[i][j] = a[k]; k++; } if(k == N) //k=N时停止循环,下面同理 break; for(q=i+1;q<m-i;q++) //画右边,从上到下 { s[q][n-i-1] = a[k]; k++; } if(k == N) break; for(j=n-i-2;j>=i;j--) //画下边,右到左 { s[m-i-1][j] = a[k]; k++; } if(k == N) break; for(q=m-i-2;q>i;q--) //画左边,下到上 { s[q][i] = a[k]; k++; } } for(i=0;i<m;i++) { for(j=0;j<n-1;j++) { printf("%d ",s[i][j]); } printf("%d",s[i][j]); //题目说了行末不能有空格,但没说不能有换行,所以这样即可 printf("\n"); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-34574.html

最新回复(0)