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);
    }
}
相关推荐
爱是小小的癌6 分钟前
Java-数据结构-优先级队列(堆)
java·前端·数据结构
sjsjs1111 分钟前
【数据结构-字典树】力扣14. 最长公共前缀
数据结构·leetcode
天乐敲代码14 分钟前
JAVASE入门十五脚-网络TCP,UDP,,Lambda
java
python算法(魔法师版)29 分钟前
基于机器学习鉴别中药材的方法
深度学习·线性代数·算法·机器学习·支持向量机·数据挖掘·动态规划
2501_903238651 小时前
自定义登录页面的Spring Security实践
java·后端·spring·个人开发
JNU freshman2 小时前
力扣第435场周赛讲解
算法·leetcode·蓝桥杯
眼镜哥(with glasses)2 小时前
蓝桥杯python基础算法(2-2)——基础算法(B)——模拟(上)
算法
飞翔的佩奇2 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的图书管理系统(含源码+数据库+答辩PPT+毕业论文)
java·数据库·spring boot·mysql·spring·毕业设计·图书管理
赵鑫亿3 小时前
7.DP算法
算法·dp
iqay3 小时前
【C语言】填空题/程序填空题1
c语言·开发语言·数据结构·c++·算法·c#