【力扣】130. 被围绕的区域
给定一个二维的矩阵,包含 '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
class Solution { int x,y; // x为横轴 y为纵轴 public void solve(char[][] board) { //1.首先,把所有的边界上的O以及同边界相连接的O赋值为一个随便的数 A //问题来了,怎么循环这个数组的边界 x = board.length; if(x == 0){ return; } y = board[0].length; //1.1完成上边界、下边界的遍历 for(int i =0 ; i< x; i++){ if(board[i][0] == 'O'){ dfs(board,i,0); // 数组的第一行 } if(board[i][y-1] == 'O'){ dfs(board,i,y-1); // 数组的最后一行 } } //1.2完成左边界、右边界的遍历 for(int i =0 ; i< y; i++){ if(board[0][i] == 'O'){ dfs(board,0,i); // 数组的第一列 } if(board[x-1][i] == 'O'){ dfs(board,x-1,i); // 数组的最后一列 } } //2.根据第一步的结果,遍历这个数组,得到哪些O需要被覆盖 for(int i =0 ; i< x; i++){ for(int j =0;j < y; j++){ if(board[i][j] == 'A'){ board[i][j]='O'; //还原 } else if(board[i][j] == 'O'){ board[i][j]='X'; //将包含的内容改为X } } } } /** * 方法: * 入参为数组、横轴、纵轴 * 结果: * 把相邻的O都改成A **/ public void dfs(char[][] board, int horizontal,int vertical){ //如果说横轴和纵轴已经小于0,大于最大值,就不能再递归了 //或者是值为X 不能再递归了 if(horizontal<0 || vertical < 0 || horizontal >= x || vertical >= y || board[horizontal][vertical] == 'X' || board[horizontal][vertical] == 'A' ){ return; } board[horizontal][vertical] = 'A'; dfs(board,horizontal+1,vertical); //从上边界往下找,是否有O的 dfs(board,horizontal-1,vertical);//从下边界往上找,是否有O的 dfs(board,horizontal,vertical+1); //从左边界往右找,是否有O的 dfs(board,horizontal,vertical-1);//从右边界往左找,是否有O的 } }
一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻