A1105 Spiral Matrix (25 分| 简单模拟,附详细注释,逻辑分析)

写在前面

  • 思路分析
    • 将给定的N个正整数按非递增顺序,填入“螺旋矩阵”
      • “螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充
      • 要求矩阵的规模为m行n列,满足条件: m*n等于N; m>=n;且m-n取所有可能值中的最小值
    • 实现分析:
      • 先计算行数m、列数n,n从根号N整数部分开始,往前推到1,找到第1个满足N %n== 0,m值等于N/n
      • 将N个给定值输入数组a,并将a数组中的值按非递增排序,接着建立m行n列数组b,填充时按层数填充,1个包裹矩阵的口字型为1层,计算螺旋矩阵层数level
        • 如果m值为偶数,层数为m/2
        • 如果m为奇数,层数为m/2+1,所以level = m / 2 + m % 2
        • 因为从左上角第1个格子开始,按顺时针螺旋⽅向填充,所以外层for循环控制层数i从0到level,内层for循环按左上到右上、右上到右下、右下到左下、左下到左上的顺序层层填充
        • 注意内层for循环中要控制t <= N –1,因为如果螺旋矩阵中所有元素已填充完毕,就不能再重复填充
      • 填充完毕后,输出整个矩阵
  • 题目有难度,核心问题:实现方案
    • 理解后,较易实现
    • 学习ing,第2次分析

测试用例

  • input:
    12
    37 76 20 98 76 42 53 95 60 81 58 93
    
    output:
    98 95 93
    42 37 81
    53 20 76
    58 60 76
    

ac代码

  • #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    using namespace std;
    int cmp(int a, int b)
    {
        return a > b;
    }
    int main()
    {
        int N, m, n, t = 0;
        scanf("%d", &N);
        for (n = sqrt((double)N); n >= 1; n--)
        {
            if (N % n == 0)
            {
                m = N / n;
                break;
            }
        }
        vector<int> a(N);
        for (int i = 0; i < N; i++)
            scanf("%d", &a[i]);
    
        sort(a.begin(), a.end(), cmp);
        // 二维数组定义形式
        vector<vector<int> > b(m, vector<int>(n));
        int level = m / 2 + m % 2;
        for (int i = 0; i < level; i++)
        {
            // 左上到右上
            for (int j = i; j <= n - 1 - i && t <= N - 1; j++)
                b[i][j] = a[t++];
            // 右上到右下
            for (int j = i + 1; j <= m - 2 - i && t <= N - 1; j++)
                b[j][n - 1 - i] = a[t++];
            // 右下到左下
            for (int j = n - i - 1; j >= i && t <= N - 1; j--)
                b[m - 1 - i][j] = a[t++];
            // 左下到左上
            for (int j = m - 2 - i; j >= i + 1 && t <= N - 1; j--)
                b[j][i] = a[t++];
        }
        for (int i = 0; i < m; i++)
        {
            for (int j = 0 ; j < n; j++)
            {
                printf("%d", b[i][j]);
                if (j != n - 1) printf(" ");
            }
            printf("\n");
        }
        return 0;
    }
    
发布了328 篇原创文章 · 获赞 107 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100618401