• pat basic 1050 螺旋矩阵


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

    输入格式:

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

    输出格式:

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

    输入样例:

    1. 12
    2. 37 76 20 98 76 42 53 95 60 81 58 93

    输出样例:

    1. 98 95 93
    2. 42 37 81
    3. 53 20 76
    4. 58 60 76

    解题思路:

    之前在其他地方找到了灵感,在处理这种问题的时候,给矩阵加一圈“墙”,会让后面的处理变得简单许多,就不用考虑边界的不同情况了。在往矩阵里放数据的时候,撞墙就右转,直到全部放满。

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int compare(const void *a, const void *b)
    4. {
    5. return *(int*)b - *(int*)a;
    6. }
    7. int divisor(int n)
    8. {
    9. int i, max=1;
    10. for ( i=2; i*i<=n; i++ ) {
    11. if ( n%i==0 ) max = i;
    12. }
    13. return max;
    14. }
    15. int main(int argc, const char *argv[])
    16. {
    17. int N, i, j, k, m, n, order=1;
    18. if ( scanf("%d", &N)==EOF ) printf("error\n");
    19. n = divisor(N);
    20. m = N/n;
    21. int num[N], arr[m+2][n+2];
    22. for ( i=0; i<N; i++ ) {
    23. if ( scanf("%d", &num[i])==EOF ) printf("error\n");
    24. }
    25. qsort(num, N, sizeof(num[0]), compare);
    26. for ( i=0; i<m+2; i++ ) {
    27. if ( i==0 || i==m+1 ) {
    28. for ( j=0; j<n+2; j++ )
    29. arr[i][j] = 1;
    30. } else {
    31. for ( j=0; j<n+2; j++ )
    32. (j==0 || j==n+1) ? ( arr[i][j]=1 ) : ( arr[i][j]=0 ) ;
    33. }
    34. }
    35. j = i = 1;
    36. k = 0;
    37. while ( k<N ) {
    38. switch ( order ) {
    39. case 1:
    40. for ( ; arr[i][j]==0; j++ ) {
    41. arr[i][j] = num[k++];
    42. }
    43. order = 2;
    44. i++;
    45. j--;
    46. break;
    47. case 2:
    48. for ( ; arr[i][j]==0; i++ ) {
    49. arr[i][j] = num[k++];
    50. }
    51. order = 3;
    52. j--;
    53. i--;
    54. break;
    55. case 3:
    56. for ( ; arr[i][j]==0; j-- ) {
    57. arr[i][j] = num[k++];
    58. }
    59. order = 4;
    60. i--;
    61. j++;
    62. break;
    63. case 4:
    64. for ( ; arr[i][j]==0; i-- ) {
    65. arr[i][j] = num[k++];
    66. }
    67. order = 1;
    68. j++;
    69. i++;
    70. }
    71. }
    72. for ( i=1; i<m+1; i++ ) {
    73. for ( j=1; j<n+1; j++ )
    74. j==n ? printf("%d\n", arr[i][j]) : printf("%d ", arr[i][j]) ;
    75. }
    76. return 0;
    77. }

  • 相关阅读:
    【MySQL】表的增删改查(基础)
    浅析 Jetty 中的线程优化思路
    量子信息处理器可能能够提供高度压缩的生成对抗学习任务的版本
    在HTML当中引入Vue控件,以element-ui为例
    SQLAlchemy详解
    胡珈魁:00后工程师的AI进阶之路 | OneFlow U
    算法设计与分析 SCAU10346 带价值的作业安排问题
    娄底干细胞制备实验室建设须知要求
    少年,你可知 Kotlin 协程最初的样子?
    【伪彩色图像处理】将灰度图像转换为彩色图像研究(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/herbertyellow/article/details/125615299