【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
相关推荐
luckys.one21 分钟前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|2 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师2 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo32 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC3 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
liulilittle4 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信
bkspiderx6 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
中华小当家呐7 小时前
算法之常见八大排序
数据结构·算法·排序算法
沐怡旸8 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试