思路
首先理解题目:
以下两种情况下的‘O ’不会被填充为‘X’:
- ‘O ’在边界上的
- 与边界上的‘O’相连的‘O’
故可以先对边界上的‘O’可进行深度搜索,将与之相连的‘O’全部换为‘-’,此时剩下的‘O’均为可以放心的填充为‘X’,再将‘-’换回‘O’。
class Solution(object):
def solve(self, board):
if len(board) == 0 or len(board[0]) == 0:
return
m = len(board) #行
n = len(board[0]) #列
#遍历边界上的O,把它以及与他相连的O换为-
for i in range(m): #每一行的第一个和最后一个
self.dfs(m, n, i, 0, board)
self.dfs(m, n, i, n - 1, board)
for j in range(n): #每一列的第一个和最后一个
self.dfs(m, n, 0, j, board)
self.dfs(m, n, m - 1, j, board)
#
for i in range(m):
for j in range(n):
#剩余的‘0’换为‘X’
if board[i][j] == 'O':
board[i][j] = 'X'
#再把‘-’换回‘O’
elif board[i][j] == '-':
board[i][j] = 'O'
return board
def dfs(self, m, n, i, j, board):
if i <0 or j < 0 or i >= m or j >= n or board[i][j] != 'O':
return
board[i][j] = '-'
self.dfs(m, n, i-1, j, board)
self.dfs(m, n, i+1, j, board)
self.dfs(m, n, i, j-1, board)
self.dfs(m, n, i, j+1, board)