GESP认证C++编程真题解析 | B4415 [GESP202509 四级] 排兵布阵

欢迎大家订阅我的CSDN专栏算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


【题目来源】

洛谷:[B4415 GESP202509 四级] 排兵布阵 - 洛谷

【题目描述】

作为将军,你自然需要合理地排兵布阵。地图可以视为 $n$ 行 $m$ 列的网格,适合排兵的网格以 $1$ 标注,不适合排兵的网格以 $0$ 标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?

【输入】

第一行,两个正整数 $n,m$,分别表示地图网格的行数与列数。

接下来 $n$ 行,每行 $m$ 个整数 $a_{i,1},a_{i,2},…,a_{i,m}$,表示各行中的网格是否适合排兵。

【输出】

一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。

【输入样例】

4 3
0 1 1
1 0 1
0 1 1
1 1 1

【输出样例】

4

【算法标签】

《洛谷 B4415 排兵布阵》 #枚举# #GESP# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 15;  // 定义矩阵的最大尺寸

int n, m;          // 矩阵的行数和列数
int maxn = 0;      // 存储全1子矩阵的最大面积
int a[N][N];       // 存储原始矩阵
int sa[N][N];      // 存储二维前缀和数组

int main()
{
    // 输入矩阵的行数和列数
    cin >> n >> m;

    // 输入矩阵数据
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
        }
    }

    // 计算二维前缀和数组
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            sa[i][j] = sa[i-1][j] + sa[i][j-1] - sa[i-1][j-1] + a[i][j];
        }
    }

    // 枚举所有可能的子矩阵
    for (int x1 = 1; x1 <= n; x1++)      // 子矩阵左上角行坐标
    {
        for (int y1 = 1; y1 <= m; y1++)  // 子矩阵左上角列坐标
        {
            for (int x2 = x1; x2 <= n; x2++)    // 子矩阵右下角行坐标
            {
                for (int y2 = y1; y2 <= m; y2++) // 子矩阵右下角列坐标
                {
                    // 计算子矩阵的和
                    int t = sa[x2][y2] - sa[x2][y1-1] - sa[x1-1][y2] + sa[x1-1][y1-1];
                    
                    // 如果子矩阵的和等于其面积(即全1矩阵)
                    if (t == ((x2 - x1 + 1) * (y2 - y1 + 1)))
                    {
                        // 更新最大面积
                        maxn = max(maxn, t);
                    }
                }
            }
        }
    }

    // 输出最大全1子矩阵的面积
    cout << maxn << endl;

    return 0;
}

【运行结果】

4 3
0 1 1
1 0 1
0 1 1
1 1 1
4
posted @ 2026-01-14 14:59  热爱编程的通信人  阅读(0)  评论(0)    收藏  举报