【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
相关推荐
积极向上的向日葵10 分钟前
有效的括号题解
数据结构·算法·
GIS小天16 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
_Itachi__37 分钟前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵
不忘不弃37 分钟前
计算矩阵A和B的乘积
线性代数·算法·矩阵
不爱写代码的玉子41 分钟前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
Java 技术轻分享1 小时前
《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
数据结构·算法·二叉树··都差速
芜湖xin1 小时前
【题解-洛谷】P1706 全排列问题
算法·dfs
chao_7892 小时前
链表题解——两两交换链表中的节点【LeetCode】
数据结构·python·leetcode·链表
曦月逸霜3 小时前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法
每次的天空3 小时前
Android第十三次面试总结基础
android·面试·职场和发展