并查集
class Solution:
def solve(self, board):
row, col = len(board), len(board[0])
p = row * col
bcj = [i for i in range(p + 1)]
def find(x):
if x != bcj[x]:
bcj[x] = find(bcj[x])
return bcj[x]
def union(x, y):
a, b = find(x), find(y)
if a != b:
bcj[a] = b
for i in range(row):
for j in range(col):
if board[i][j] == 'O':
if i == 0 or i == row - 1 or j == 0 or j == col - 1:
union(i * col + j, p)
else:
for k in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
ii, jj = i + k[0], j + k[1]
if board[ii][jj] == 'O':
union(i * col + j, ii * col + jj)
for i in range(row):
for j in range(col):
if find(p) != find(i * col + j):
board[i][j] = 'X'
dfs
class Solution:
def solve(self, board):
row, col = len(board), len(board[0])
start = [(i, j) for i in range(row) for j in range(col) if board[i][j] == 'O' and (i == 0 or i == row - 1 or j == 0 or j == col - 1)]
o = start.copy()
def dfs(a, b):
for x, y in [(-1, 0), (0, -1), (1, 0), (0, 1)]:
aa, bb = a + x, b + y
if 0 <= aa < row and 0 <= bb < col and board[aa][bb] == 'O' and (aa, bb) not in o:
o.append((aa, bb))
dfs(aa, bb)
for i, j in start:
dfs(i, j)
for i in range(row):
for j in range(col):
if (i, j) not in o:
board[i][j] = 'X'