题目描述:
给定一个二维的矩阵,包含 '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'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions
解题思路:DFS+遍历实现,先使用DFS将数组边界上的 'O'转换成 'Y'
然后在循环遍历整个二维数组,将数组中的所有‘O’转换成'X',将'Y'转换为'O'
java实现:
class Solution { public void solve(char[][] board) { if(board.length == 0 || board[0].length==0){ return; } int row = board.length; int col = board[0].length; for(int i=0;i<row;i++){ dfsSearch(board,i,0); // 左边界 dfsSearch(board,i,col-1); // 右边界 } for(int j=0;j<col;j++){ dfsSearch(board,0,j); // 上边界 dfsSearch(board,row-1,j); // 下边界 } for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ if(board[i][j] == 'O'){ board[i][j] = 'X'; } else if(board[i][j] == 'Y'){ board[i][j] = 'O'; } } } } // 这里DFS要注意,越界情况 public void dfsSearch(char[][] board, int row,int col){ if(board[row][col] == 'O'){ board[row][col] = 'Y'; if(row > 1){ dfsSearch(board,row-1,col); } if(col > 1){ dfsSearch(board,row,col-1); } if(row < board.length - 1){ dfsSearch(board,row+1,col); } if(col < board[0].length - 1){ dfsSearch(board,row,col+1); } } } }