题目描述:
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。
找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例:
X X X X
X O O X
X X O X
X O X X
运行你的函数后,矩阵变为:
X X X X
X X X X
X X X X
X O X X
链接:https://leetcode-cn.com/problems/surrounded-regions
解法1:
找到边界上的O,对边界上的每个O进行广度优先搜索(bfs)
用bfs找到与边界联通的O,将其改为*,最后将O改为X,将*改为O
class Solution:
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
if not board:
return
m,n=len(board),len(board[0])
def _solve(i,j):
if board[i][j]!="O":
return
queue=list()
queue.append((i,j))
while queue:
x,y=queue.pop(0)
if board[x][y]!="O":
continue
board[x][y]="*"
directions=[(-1,0),(1,0),(0,-1),(0,1)]
for d in directions:
nx=x+d[0]
ny=y+d[1]
if 0<=nx<m-1 and 0<=ny<n-1 and board[nx][ny]=="O":
queue.append((nx,ny))
for i in range(m):
list(map(_solve,(i,i),(0,n-1)))
for j in range(n):
list(map(_solve,(0,m-1),(j,j)))
for i in range(m):
for j in range(n):
if board[i][j]=="O":
board[i][j]="X"
if board[i][j]=="*":
board[i][j]="O"
解法2:
找到边界上的O,对边界上的每个O进行深度优先搜索(dfs)
用dfs找到与边界联通的O,将其改为*,最后将O改为X,将*改为O
class Solution:
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
if not board:
return
m,n=len(board),len(board[0])
def _solve(i,j):
if board[i][j]!="O":
return
stack=list()
stack.append((i,j))
while stack:
x,y=stack[-1]
board[x][y]="*"
directions=[(-1,0),(1,0),(0,-1),(0,1)]
for d in directions:
nx=x+d[0]
ny=y+d[1]
if 0<=nx<m-1 and 0<=ny<n-1 and board[nx][ny]=="O":
stack.append((nx,ny))
break
if (x,y)==(stack[-1]):
stack.pop()
for i in range(m):
list(map(_solve,(i,i),(0,n-1)))
for j in range(n):
list(map(_solve,(0,m-1),(j,j)))
for i in range(m):
for j in range(n):
if board[i][j]=="O":
board[i][j]="X"
if board[i][j]=="*":
board[i][j]="O"