1. 问题背景与核心思路
这是一个典型的网格遍历优化问题。给定一个由字符组成的二维网格,其中:
- 'W'代表墙壁(不可穿透)
- 'E'代表敌人
- '0'代表空地(可以放置炸弹)
我们需要找到一个空地位置放置炸弹,使得炸弹能消灭的敌人数量最多。炸弹的爆炸范围是整行和整列,直到碰到墙壁为止。
1.1 暴力解法分析
最直观的解法是对每个空地位置('0'),分别向四个方向(上、下、左、右)遍历,统计能炸到的敌人数量。这种方法的时间复杂度是O(mn*(m+n)),其中m和n分别是网格的行数和列数。对于较大的网格,这种解法效率太低。
cpp复制// 暴力解法伪代码
for 每个网格位置(i,j):
if grid[i][j] == '0':
向上遍历统计敌人
向下遍历统计敌人
向左遍历统计敌人
向右遍历统计敌人
更新最大值
1.2 动态规划优化思路
观察发现,同一行或同一列中,位于两个墙壁之间的所有空地,它们能炸到的行敌人或列敌人数量是相同的。因此我们可以:
- 按行遍历时,缓存当前行在两个墙壁之间的敌人总数
- 按列遍历时,缓存当前列在两个墙壁之间的敌人总数
- 对于每个空地位置,其能炸到的敌人总数 = 行敌人数 + 列敌人数
这样可以将时间复杂度优化到O(mn),因为我们只需要遍历网格两次(一次行方向,一次列方向)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 详细算法实现
2.1 数据结构设计
我们使用以下变量来存储中间结果:
rowHits:当前行在两个墙壁之间的敌人数量colHits[j]:第j列在两个墙壁之间的敌人数量maxCount:记录最大敌人消灭数
2.2 行方向遍历处理
从左到右遍历每一行时:
- 遇到墙壁时,重置
rowHits为0 - 遇到敌人时,
rowHits加1 - 遇到空地时,记录当前
rowHits值(这部分敌人可以被炸到)
cpp复制for (int i = 0; i < m; ++i) {
int rowHits = 0;
for (int j = 0; j < n; ++j) {
if (grid[i][j] == '
