给定一个二维的矩阵,包含 ‘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’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
代码
class Solution {public void solve(char[][] board) {if(board.length==0) return;int n=board.length,m=board[0].length;int[][] dir=new int[][]{{0,1},{1,0},{-1,0},{0,-1}};boolean[][] check=new boolean[n][m];Queue<int[]> queue=new LinkedList<>();for(int i=0;i<m;i++)//将边界的O入队{if(board[0][i]=='O') {queue.add(new int[]{0,i});check[0][i]=true;}if(board[n-1][i]=='O') {queue.add(new int[]{n-1,i});check[n-1][i]=true; }}for(int i=1;i<n-1;i++){if(board[i][0]=='O') {queue.add(new int[]{i,0});check[i][0]=true;}if(board[i][m-1]=='O'){queue.add(new int[]{i,m-1});check[i][m-1]=true;}}while (!queue.isEmpty())//bfs将与边界O连接的点找出来标记{int[] temp=queue.poll();for (int[] d:dir){int x=temp[0]+d[0],y=temp[1]+d[1];if(x<0||x>=n||y<0||y>=m||board[x][y]=='X'||check[x][y]) continue;queue.offer(new int[]{x,y});check[x][y]=true;}}for(int i=0;i<n;i++)//除了与边界O连接的点,全部置为xfor(int j=0;j<m;j++)board[i][j]=check[i][j]?'O':'X';}
}