Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
深度优先搜索的解题详细介绍,点击
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
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'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
分析:
题中给出一个地图,让你把被X框住的O的连通体全部变成X。
有几个需要注意的点:
1、当出现一下这种情况的时候,图不改变:
/* * XXXX * XOOX * XXOX * XOOX */
不改变的原因是,最后一行有O,所以让所有的O不被X包围了。
2、根据1所分析的,我们引入一个vis数组来记录是否被访问,然后我们只需要找出 第一行,最后一行,第一列,最后一列里面出现的O,然后进入DFS,找出这些O的连通块就好了,把这些O的vis都设置为1。
然后DFS全部结束后,遍历board数组,把vis[i][j]==0(没被访问过,即与边界不连通)的且board[i][j]=='O'的全部变为'X'就好了。
AC代码:
class Solution { int dirx[] = {0,0,1,-1}; int diry[] = {1,-1,0,0}; public void solve(char[][] board) { if(board.length==0 || board==null) return; int[][] vis = new int[board.length][board[0].length]; for(int i=0;i<board.length;i++){ for(int j=0;j<board[0].length;j++){ boolean isEdge = i==0||j==0||i==board.length-1||j==board[0].length-1; if(isEdge && board[i][j]=='O'){ dfs(board,vis,i,j); } } } for(int i=0;i<board.length;i++){ for(int j=0;j<board[0].length;j++){ if(board[i][j]=='O' && vis[i][j]==0){ board[i][j] = 'X'; } } } } public void dfs(char[][] board, int[][] vis, int i, int j) { if(i<0 || j<0 || i>=board.length || j>=board[0].length || board[i][j]=='X' ||vis[i][j]==1){ return; } vis[i][j] = 1; for(int a=0;a<4;a++){ int xx = i + dirx[a]; int yy = j + diry[a]; dfs(board,vis,xx,yy); } } }
作者:秦羽纶
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.