题目
给定一个二维的矩阵,包含 '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'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
分析
深度广度优先题目,原解题报告链接 点击打开链接
大概思路是,只要把不和边界O连通的 O 换位X就可以了。所以我们只需要遍历一下四条边,将于边界O相连的O做上标记,最后遍历char[][]数组,来改变一下字母和符号就可以了。
在找到边界O时,需要向它的四周去找和它相通的O,这里就用到了队列,被连通的O的坐标首先入队,然后出队,判断它的四周是否有连通的O,入队,再出队,判断是否有连通的O……直到队列中没有元素。
扫描二维码关注公众号,回复:
57355 查看本文章
代码
class Solution { public void solve(char[][] board) { if(board.length == 0 ) return; int row = board.length; int col = board[0].length; for (int i = 0; i < row; i++) { if (board[i][0] == 'O') helper(board,i,0); if (board[i][col-1] == 'O') helper(board,i,col-1); } for (int i = 0; i < col; i++) { if (board[0][i] == 'O') helper(board,0,i); if (board[row-1][i] == 'O') helper(board,row-1,i); } 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] == '*') board[i][j] = 'O'; } } public static void helper( char[][] board , int x, int y ){ int[][] nums = {{0,1},{0,-1},{1,0},{-1,0}}; Queue<Integer[]> queue = new LinkedList<>(); Integer[] integers = {x,y}; queue.offer(integers); board[x][y] = '*'; while ( queue != null && queue.size() != 0){ Integer[] temp = queue.poll(); for (int i = 0; i < 4; i++) { Integer newX = temp[0]+nums[i][0]; Integer newY = temp[1]+nums[i][1]; if (newX < 0 || newX >= board.length || newY < 0 || newY >= board[0].length) continue; if (board[newX][newY] == 'O'){ board[newX][newY] = '*'; Integer[] t = {newX, newY}; queue.offer(t); } } } } }