1、深度优先搜索
# 深度优先
def dfs(node=None):
if node is None:
return
nodeSet=set() # 定义登记节点集合
stack=[] # 用List来表示栈
print(node.getValue()) # 打印节点的值
nodeSet.add(node) # 登记遍历过的节点
stack.append(node) # 将节点压入栈
while len(stack)>0:
cur=stack.pop() # 将list中最末尾的元素删除,并返回元素值
for next in cur.getConnect(): # 遍历该节点的邻接节点
if next not in nodeSet: # 如果该节点还没登记
print(next.getValue()) # 打印邻接节点的值
nodeSet.add(next) # 登记邻接节点
stack.append(cur) # 将节点再次压入
stack.append(next) # 将邻接节点压入
break # 退出,保持深度优先
130、被围绕的区域
我完全没看懂题目,引用https://blog.csdn.net/qq_17550379/article/details/82688731
被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
这个问题,和之前的 Leetcode 79:单词搜索(最详细的解法!!!)、Leetcode 200:岛屿的个数(最详细的解法!!!)很类似。这个问题一个很简单的处理思路就是将外围的O元素单独考虑。基于这个思路,我们将外围的O替换为标记为*。
X X X X
X O O X
X X O X
X * X X
然后我们就只要将图中的O替换成X,将*替换成O即可。这里有这样一种情况
X X X X
X O O X
X X O X
X O O X
这里的O全部就外围元素。替换为*,就变成了
X X X X
X * * X
X X * X
X * * X
所以我们现在的问题就变成了:在这个图的边界位置出发找连通的O。这就和之前的问题联系在一起了。
class Solution:
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
if not board:
return None
m, n = len(board), len(board[0])
d = [(-1, 0), (0, 1), (1, 0), (0, -1)]
def _solve(i, j):
if 0 <= i < m and 0 <= j < n and board[i][j] == 'O':
board[i][j] = '*'
for k in range(4):
_solve(i + d[k][0], j + d[k][1])
for i in range(m):
_solve(i, 0)
_solve(i, n - 1)
for i in range(n):
_solve(0, i)
_solve(m - 1, i)
for i in range(m):
for j in range(n):
if board[i][j] == 'O':
board[i][j] = 'X'
elif board[i][j] == '*':
board[i][j] = 'O'