• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
๑¹¹
博客园    首页    新随笔    联系   管理    订阅  订阅

小美的平衡矩阵

一、题目信息

二、解题思路

    1、题目限制如下

    2、输出要求?
    根据输出可以看出第一行输出的是所有1*1子矩阵中符合完美矩阵(矩阵中 0 的个数等于 1 的个数)条件的矩阵个数,其余输出同理。
    3、如何存储矩阵数据?
    采用 200 * 200 的数组存储数据,占用空间约 39 KB
    4、如何遍历所有子矩阵?
    采用按行遍历的方式。比如>采用按行遍历的方式。比如 2*2 的矩阵,从左上角2*2的矩阵开始,往右移动一个单位即得到一个新的矩形,直至移动到 200 * 200 矩阵的最后一列。接下来还从最左边开始(左上角的矩阵向下移动一行),同理再每向右移动一个单位得到一个新矩阵。整个过程即从左上角2*2的矩阵开始,移动到右下角2*2的矩阵结束,得到了所有的子矩阵。
    5、如何判断子矩阵是否为完美矩阵?
    计算矩阵的值(所有元素的和),值=矩阵元素个数/2(必须整除)即完美矩阵,首先对 2 取模,模不为零不满足,因为不能整除
    6、如何快速计算子矩阵的值?
    首先保存前一个矩阵(旧矩阵)的值,每移动一个单位不用遍历新矩阵的所有元素来计算值,计算新矩阵相较于旧矩阵新增列与失去列的差值即可,差值与旧矩阵值的和就得到了新矩阵的值
    7、实现(仅供参考)
    点击查看代码
    #include <iostream>
    #include<array>
    
    void checkPerfectMatrix(const size_t childLine, const size_t& maxLine, const std::array<std::array<char, 200>, 200>& matrix, size_t& perfectMatrix) {
    
        // 奇数个矩阵元素不符合要求
        if (childLine * childLine % 2) {
            return;
        }
    
        size_t sum = 0, curHeadOfRowMatrixValue = 0, matrixRowStart = 0, matrixRowEnd = childLine, matrixColumnStart = 0, matrixColumnEnd = childLine;
    
        // child matrix
        for (int i = matrixRowStart; i < matrixRowEnd; i++) {
            for (int j = matrixColumnStart; j < matrixColumnEnd; j++) {
                sum += matrix[i][j] - '0';
            }
        }
        curHeadOfRowMatrixValue = sum;
        while(1) {
    
            // sum of matrix elem
            if (matrixColumnStart > 0) {
                for (int i = matrixRowStart; i < matrixRowEnd; i++) {
                    sum += (matrix[i][matrixColumnEnd -1] - matrix[i][matrixColumnStart - 1]);
                }
            }
    
            // judge perfect matrix
            if ((sum != 0) && (sum == childLine*childLine/2)) {
                perfectMatrix++;
            }
    
            // reinit
            matrixColumnStart++; matrixColumnEnd++;
            if (matrixColumnEnd > maxLine) {
                matrixRowStart++, matrixRowEnd++, matrixColumnStart = 0, matrixColumnEnd = childLine;
                for (int i = 0; i < childLine; i++) {
                    sum = curHeadOfRowMatrixValue;
                    sum += (matrix[matrixRowEnd - 1][i] - matrix[matrixRowStart - 1][i]);
                    curHeadOfRowMatrixValue = sum;
                }
                if (matrixRowEnd > maxLine) {
                    break;
                }
            }
    
        }
    
    }
    int main() {
    
        size_t maxLine = 0, perfectMatrix = 0; const size_t LINE = 0; const size_t ROW = 1;
        std::array<std::array<char, 200>, 200> matrix;
        std::cin >> maxLine;
    
        // init matrix
        for (int i = 0; i < maxLine; i++) {
            for (int j = 0; j < maxLine; j++) {
                std::cin >> matrix[i][j];
            }
        }
    
        for (int i = 0; i < maxLine; i++) {
    
            // output perfect matrix
            checkPerfectMatrix(i+1, maxLine, matrix, perfectMatrix);
            std::cout << perfectMatrix << std::endl;
            perfectMatrix = 0;
        }
    
    
        return 0;
    }
    
    8、结果
作者:ThinkerOne
出处:https://www.cnblogs.com/zwsmile/p/14150552.html
声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
posted @ 2024-05-28 21:02  ๑¹¹  阅读(554)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3