本题要求将给定的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 7658 60 76
思路分析:通过顶点坐标确定矩阵的边界,画画图就出来了,看一眼我的代码吧注释写得很清楚了
代码如下:
#include<stdio.h> #include<math.h> #include<stdlib.h> int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } int main() { int N, i,j,k,l, *arr=NULL,mem,meN; int beg, over, men; int m, n; int **pmn=NULL; // int pmn[100][100]; int lu[2], ld[2], ru[2], rd[2]; //输入 scanf("%d",& N); arr = (int *)malloc(sizeof(int)*N); for (i = 0; i < N; i++) { scanf("%d", &arr[i]); } qsort(arr, N, sizeof(int), cmp); m=(int)sqrt(N); n = m; mem = m; //以平方根为中间值向两边查找m*n大于N时令n-1 while ((m*n) != N) { while((m*n )< N&&(m*n) != N) { m++; } if (m*n == N) break; n--; m = mem; } //创建二维数组 pmn = (int **)malloc(sizeof(int *)*m+1); for (i = 0; i < m; i++) { pmn[i] = (int *)malloc(sizeof(int)*n+1); } //开始螺旋赋值 //初始化边界x[0]为行标,x[1]为横着数 lu[0] = 0; lu[1] = 0; ru[0] = 0; ru[1] = n - 1; rd[0] = m - 1; rd[1] = n - 1; ld[0] = m - 1; ld[1] = 0; //初始化矩阵行数mem,列数men mem = m; men = n; //初始化数组指针 meN = 0; while (meN < N) { for (i = lu[0], j = lu[1]; meN < N&&j <ru[1]; j++) { pmn[i][j] = arr[meN++]; } //men--; if (lu[0] < ld[0])lu[0]++; else if (lu[0] > ld[0])break; if(lu[1]<ru[1])lu[1]++; //lu[0]++; for (i = ru[0], j = ru[1]; meN < N&&i<rd[0]; i++) { pmn[i][j] = arr[meN++]; } if( ru[0]<rd[0])ru[0]++; if(ru[1]>lu[1])ru[1]--; for (i = rd[0], j = rd[1]; meN < N&&j > ld[1]; j--) { pmn[i][j] = arr[meN++]; } if (ru[0]<rd[0])rd[0]--; if(rd[1]>ld[1])rd[1]--; for (i = ld[0], j = ld[1]; meN<N&&i>lu[0]-1; i--) { pmn[i][j] = arr[meN++]; } if(ld[0]>lu[0])ld[0]--; if(ld[1]<rd[1])ld[1]++; } for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (j != n - 1) printf("%d ", pmn[i][j]); else printf("%d", pmn[i][j]); } printf("\n"); } free(arr); for (i = 0; i < m; i++) { free(pmn[i]); } return 0; }