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',查找的方法与“岛屿”问题类似,不在赘述。
https://blog.csdn.net/qq_17753903/article/details/82933759
然后,判断连接在一起的‘O’,是否有在边界的:
如果有,则不用翻转;
如果没有,证明被'X'所包围,将所有的'O'翻转为'X'。