1. 程式人生 > >LeetCode-130. Surrounded Regions

LeetCode-130. Surrounded Regions

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'。