Leetcode面试经典150题-130.被围绕的区域

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' 组成,捕获 所有 被围绕的区域:

  • **连接:**一个单元格与水平或垂直方向上相邻的单元格连接。
  • 区域:连接所有 'O' 的单元格来形成一个区域。
  • 围绕: 如果您可以用 'X' 单元格 连接这个区域 ,并且区域中没有任何单元格位于 board 边缘,则该区域被 'X' 单元格围绕。

通过将输入矩阵 board 中的所有 'O' 替换为 'X' 来 捕获被围绕的区域。

示例 1:

**输入:**board = \["X","X","X","X","X","O","O","X","X","X","O","X","X","O","X","X"]

输出:\["X","X","X","X","X","X","X","X","X","X","X","X","X","O","X","X"]

解释:

在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。

示例 2:

**输入:**board = \["X"]

输出:\["X"]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 为 'X' 或 'O'

深度优先遍历,注意分析题意,其他的就不多说了,上代码,看不懂的请留言或者私信,收到第一时间解答

java 复制代码
class Solution {
    /**这个题的突破口是什么样的才能不被捕获:我理解如果不被捕获,这个格子必定连着某个边缘的格子
    因为边缘的格子能连通它,所以它才不被捕获,这样我们就从边缘的O开始感染,所有被感染到的标记一个Y
    这样最后除了Y之外的全部设置成X就可以了 */
    public void solve(char[][] board) {
        for(int i = 0; i < board.length; i++) {
            /**只有边缘才配感染 */
            if(board[i][0] == 'O') {
                infect(board, i, 0);
            }
            if(board[i][board[i].length - 1] == 'O') {
                infect(board, i, board[i].length - 1);
            }
        }
        for(int j = 0; j < board[0].length; j++) {
            /**只有边缘才配感染 */
            if(board[0][j] == 'O') {
                infect(board, 0, j);
            }
            if(board[board.length - 1][j] == 'O') {
                infect(board, board.length - 1, j);
            }
        }
        /**根据感染的结果进行赋值*/
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                board[i][j] = board[i][j] == 'Y'? 'O' : 'X';
            }
        }
    }

    public void infect(char[][] board, int row, int col) {
        if(row < 0 || row >= board.length || col < 0 || col >= board[row].length || board[row][col] != 'O') {
            return;
        }
        /**把自己感染成'Y'*/
        board[row][col] = 'Y';
        /**感染自己的上下左右 */
        infect(board, row - 1, col);
        infect(board, row, col + 1);
        infect(board, row + 1, col);
        infect(board, row, col - 1);
    }
}
相关推荐
2301_780789663 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
学长毕设4 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
ZhengEnCi4 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
步行cgn4 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川4 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵4 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
秋天的怀念_David5 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1005 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
Pniubi5 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6185 小时前
大模型落地三重优化实战
人工智能·算法·机器学习