1050. 螺旋矩阵(25)
时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求将给定的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
#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 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; }
#include <stdio.h> //鬼知道怎么过不了 哪位大神能看出错误吗 - -!!!求 #include <stdlib.h> #include <string.h> #include <math.h> void cmp(const void *a, const void *b) { return *((int *)b) - *((int *)a); } void Print(int, int, int*); int main() { int N, m, n, i, j; int arr[100000] = { 0 }; scanf("%d", &N); if (N != 0) { for (i = 1; i*i<N; i++); for (; N%i != 0; i++); m = i; n = N / m; } for (i = 0; i < N; i++) scanf("%d", &arr[i]); qsort(arr, N, sizeof(int), cmp); Print(m, n, arr); } void Print(int row, int col, int* a) { int **arr; int r = 0, c = 0, i, j = 0; arr = (int **)malloc(sizeof(int *) *row); for (i = 0; i < row; i++) arr[i] = (int *)malloc(sizeof(int) * col); for (r = 0; r < row; r++) for (c = 0; c < col; c++) arr[r][c] = 0; r = 0, c = 0; arr[0][0] = a[j++]; while (j < row*col) { while (c < col - 1 && !arr[r][c + 1]) arr[r][++c] = a[j++]; while (r < row - 1 && !arr[r + 1][c]) arr[++r][c] = a[j++]; while (c >= 1 && !arr[r][c - 1]) arr[r][--c] = a[j++]; while (r >= 1 && !arr[r - 1][c]) arr[--r][c] = a[j++]; } for (r = 0; r < row; r++) { for (c = 0; c < col; c++) if (c == col - 1) printf("%d", arr[r][c]); else printf("%d ", arr[r][c]); printf("\n"); } }