給定一個二維的矩陣,包含 ‘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';}
}