130. 被围绕的区域https://leetcode.cn/problems/surrounded-regions/
难度中等797
给你一个 m x n
的矩阵 board
,由若干字符 'X'
和 'O'
,找到所有被 'X'
围绕的区域,并将这些区域里所有的 '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"]] 解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的'O'
都不会被填充为'X'
。 任何不在边界上,或不与边界上的'O'
相连的'O'
最终都会被填充为'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
示例 2:
输入:board = [["X"]] 输出:[["X"]]
提示:
m == board.length
n == board[i].length
1 <= m, n <= 200
board[i][j]
为'X'
或'O'
通过次数174,578提交次数383,292
矩阵元素有三种情况:
- 字母X
- 被字母X包围的字母O
- 没有被字母x包围的字母O
要求将说所有被字母X包围的O都变成字母X。
突破点:任何边界上的O都不会被填充为X。
===》 所有的不被字母X包围的O都直接或间接与边界上的O相连。实现:
以每个边界上的字母O为起点,标记所有与它直接或间接相连的字母O。(可以用广度优先遍历/深度优先遍历)
最后遍历一遍矩阵:有标记——修改为字母O
无标记——修好为字母X
代码:
class Solution {
int len_x;
int len_y;
public void solve(char[][] board) {
len_x = board.length;
len_y = board[0].length;
// 遍历边界
for(int i=0;i<len_x;i++)
{
for(int j=0;j<len_y;j++)
{
if(board[i][j]=='O'&&(i==0 ||i==len_x-1||j==0||j==len_y-1))
{
System.out.print(board[i][j]);
dfs(board,i,j);
}
}
System.out.println();
}
// 遍历整个矩阵
for(int i=0;i<len_x;i++)
{
for(int j=0;j<len_y;j++)
{
if(board[i][j]=='O') board[i][j] = 'X';
if(board[i][j]=='A') board[i][j] = 'O';
System.out.print(board[i][j]);
}
System.out.println();
}
}
void dfs(char[][]board,int x ,int y)
{
if(x<0 || y<0|| x>=len_x || y>=len_y ||board[x][y]!='O') return;
board[x][y]='A';
dfs(board,x-1,y);//上
dfs(board,x+1,y);//下
dfs(board,x,y-1);//左
dfs(board,x,y+1);//右
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69098.html