Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region.this
原本想用dfs作,代碼感受比bfs感受簡單多了,結果作出來是stackoverflow的,要加上限制條件,才能跑過。遇到這種圖問題仍是要先肯定一下圖的大小,再肯定用BFS仍是DFScode
public void solve(char[][] board) { //corner case if(board == null || board.length <= 1 || board[0] == null || board[0].length <= 1) return; int rows = board.length, cols = board[0].length; //flip all adjacent boarder O into Y, the first col for(int i = 0; i < rows; i++){ if(board[i][0] == 'O'){ helper(board, rows, cols, i, 0); } } //flip all adjacent boarder O into Y, the first row for(int j = 0; j < cols; j++){ if(board[0][j] == 'O'){ helper(board, rows, cols, 0, j); } } //flip all adjacent boarder O into Y, the last col for(int i = 0; i < rows; i++){ if(board[i][cols - 1] == 'O'){ helper(board, rows, cols, i, cols - 1); } } //flip all adjacent boarder O into Y, the last row for(int j = 0; j < cols; j++){ if(board[rows - 1][j] == 'O'){ helper(board, rows, cols, rows - 1, j); } } //flip all 'Y' into 'O', flip all 'O' into 'X' for(int i = 0; i < rows; i++){ for(int j = 0; j < cols; j++){ if(board[i][j] == 'Y'){ board[i][j] = 'O'; } else if(board[i][j] =='O'){ board[i][j] = 'X'; } } } } private void helper(char[][] board, int rows, int cols, int i, int j){ //base case if(i < 0 || i >= rows || j < 0 || j >= cols || board[i][j] != 'O'){ return; } board[i][j] = 'Y'; //go up if(i < rows - 2) helper(board, rows, cols, i + 1, j); //go down if(i > 1) helper(board, rows, cols, i - 1, j); //go left if(j > 1) helper(board, rows, cols, i, j - 1); //go right if(j < cols - 2) helper(board, rows, cols, i, j + 1); }
把四周的是‘O’的點所有加入queue, 把與它相連的'O'再所有加入queue,翻轉成'#'
最後再所有遍歷一遍,把’#'變成’O‘,’O‘變成’X'ip
class Point{ //fields private int x; //the row of the Point private int y; //the col of the Point //methods public Point(int x, int y){ this.x = x; this.y = y; } } public void solve(char[][] board) { //corner case if(board == null || board.length <= 2 || board[0] == null || board[0].length <= 2) return; int rows = board.length, cols = board[0].length; Queue<Point> queue = new LinkedList<Point>(); for(int i = 0; i < rows; i++){ if(board[i][0] == 'O'){ queue.offer(new Point(i, 0)); board[i][0] = '#'; } if(board[i][cols - 1] == 'O' ){ queue.offer(new Point(i, cols - 1)); board[i][cols - 1] = '#'; } } for(int j = 0; j < cols; j++){ if(board[0][j] == 'O'){ queue.offer(new Point(0, j)); board[0][j] = '#'; } if(board[rows - 1][j] == 'O'){ queue.offer(new Point(rows - 1, j)); board[rows - 1][j] = '#'; } } int[][] directions = new int[][]{{-1,0},{1,0},{0,1},{0,-1}}; while(!queue.isEmpty()){ Point cur = queue.poll(); for(int k = 0; k < 4; k++){ int row = cur.x + directions[k][0]; int col = cur.y + directions[k][1]; if(row >= 0 && row < rows && col >= 0 && col < cols && board[row][col] == 'O'){ board[row][col] = '#'; queue.offer(new Point(row, col)); } } } //flip for(int i = 0; i < rows; i++){ for(int j = 0; j < cols; j++){ if(board[i][j] == '#'){ board[i][j] = 'O'; } else if(board[i][j] == 'O'){ board[i][j] = 'X'; } } } }