【LeetCode】803、打砖块

【LeetCode】803、打砖块

文章目录


一、洪水填充DFS、时光倒流

1.1 洪水填充DFS、时光倒流

  1. 先让 炮弹打到的位置 值-1
  2. 天花板第一行, 把 "值1" 洪水填充为 "值2"
  3. 时光倒流: 逆时间顺序, 把炮弹打到的位置 值+1, 若该格子的值为1则把"值1"洪水填充为"值2", 看能增加几个"值2", 就是该格子消除后能掉落几个砖块

第三步, 要排除自己的砖块

go 复制代码
// go
func hitBricks(g [][]int, hits [][]int) []int {
    m, n := len(g), len(g[0])
    ans := make([]int, len(hits))
    if m == 1 {return ans}

    for _, h := range hits { // 炮弹位置值-1
        g[h[0]][h[1]]--
    }

    var dfs func(i,j int) int
    dfs = func(i,j int) int {
        if i < 0 || i == m || j < 0 || j == n || g[i][j] != 1 {return 0}
        g[i][j] = 2
        return 1 + dfs(i-1,j) + dfs(i+1,j) + dfs(i,j-1) + dfs(i,j+1)
    }
    for j := range n { // 天花板洪水填充
        if g[0][j] == 1 {
            dfs(0,j)
        }
    }

    worth := func(i,j int) bool { // 是否值得 时光倒流 时的洪水填充
        return g[i][j] == 1 && (i == 0 || (i > 0 && g[i-1][j] == 2) || (i < m-1 && g[i+1][j] == 2) || (j > 0 && g[i][j-1] == 2) || (j < n-1 && g[i][j+1] == 2))
    }
    for k := len(hits)-1; k >= 0; k-- { // 时光倒流 逆时间顺序 处理每个炮弹
        h := hits[k]
        i,j := h[0],h[1]
        g[i][j]++
        if worth(i,j) {
            ans[k] = dfs(i,j)-1
        }
    }
    return ans
}

二、多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

cpp 复制代码
// cpp
go 复制代码
// go 同上
python 复制代码
# python
rust 复制代码
// rust
js 复制代码
// js
ts 复制代码
// ts
相关推荐
Jack2012 分钟前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 小时前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE21218 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE21218 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术1 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦1 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050731 天前
(一)小红的数组操作
算法·编程语言
怕浪猫1 天前
Electron 系列文章封面图
算法·架构·前端框架
徐小夕1 天前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法