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

浙公网安备 33010602011771号