LeetCode-130. Surrounded Regions
阿新 • • 發佈:2018-12-13
0.原題
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.
Example:
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X
Explanation:
Surrounded regions shouldn’t be on the border, which means that any 'O'
on the border of the board are not flipped to 'X'
. Any 'O'
that is not on the border and it is not connected to an 'O'
on the border will be flipped to 'X'
. Two cells are connected if they are adjacent cells connected horizontally or vertically.
1.程式碼
class Solution: def solve(self, board): """ :type board: List[List[str]] :rtype: void Do not return anything, modify board in-place instead. """ self.rows = len(board) if self.rows: self.columns = len(board[0]) self.visited = [[False for _ in range(self.columns)]for _ in range(self.rows)] for r in range(self.rows): for c in range(self.columns): if board[r][c] == "O" and not self.visited[r][c]: coordinate_dict = {'rows':[],'columns':[]} self.visit(board,r,c,coordinate_dict) self.flip(board,coordinate_dict) def visit(self,board,row,column,coordinate_dict): if board[row][column] == 'X': return 0 else: if not self.visited[row][column]: coordinate_dict['rows'].append(row) coordinate_dict['columns'].append(column) self.visited[row][column] = True if row - 1 >= 0 : self.visit(board,row-1,column,coordinate_dict) if row + 1 < self.rows: self.visit(board,row+1,column,coordinate_dict) if column - 1 >= 0: self.visit(board,row,column-1,coordinate_dict) if column + 1 < self.columns: self.visit(board,row,column+1,coordinate_dict) def flip(self, board, coordinate_dict): min_row = min(coordinate_dict['rows']) min_column = min(coordinate_dict['columns']) max_row = max(coordinate_dict['rows']) max_column = max(coordinate_dict['columns']) if min_row == 0 or min_column == 0 or max_row == self.rows-1 or max_column == self.columns-1: return 0 else: for (row, column) in zip(coordinate_dict['rows'], coordinate_dict['columns']): board[row][column] = "X" if __name__ == "__main__": board = [["X","O","X","O","X","O"],["O","X","O","X","O","X"],["X","O","X","O","X","O"],["O","X","O","X","O","X"]] board2 = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]] solution = Solution() solution.solve(board2) print(board)
2.思路
首先查詢所有相連的'O',查詢的方法與“島嶼”問題類似,不在贅述。
然後,判斷連線在一起的‘O’,是否有在邊界的:
如果有,則不用翻轉;
如果沒有,證明被'X'所包圍,將所有的'O'翻轉為'X'。