返回
难题求解:破解LeetCode 130,围困中的希望
见解分享
2023-09-04 20:08:58
困局初现:
当我们审视LeetCode 130题,首先映入眼帘的是一个由“X”和“O”构成的二维矩阵。这些符号看似随意分布,却暗藏玄机:字母“O”代表着生机和希望,而“X”则是它们面临的威胁。我们的任务是拯救那些被“X”重重包围的“O”,将它们从绝望的境地中解救出来。
探究算法:
为了攻克LeetCode 130题,我们可以选择两种算法武器:深度优先搜索(DFS)和广度优先搜索(BFS)。两者的运作方式虽有差异,但殊途同归,都致力于识别并拯救那些被困的“O”。
从源头出发,深度优先搜索(DFS)如同一名执着的探险家,沿着矩阵中的路径深入探索。它从一个未被包围的“O”开始,沿着相邻的“O”不断前行,直到抵达矩阵的边界或遭遇“X”的阻拦。在这个过程中,DFS就像一个顽强的开拓者,将“O”的版图不断拓展。
广度优先搜索(BFS)则更像一位足智多谋的将军,它从所有未被包围的“O”同时出击,向四周辐射探索。BFS就像一支训练有素的军队,层层推进,不断扩大自己的领地。每当遇到“X”的阻拦,BFS就会避开它,继续向下一个“O”进发。
携手并进,二者相得益彰。DFS的执着探索可以快速找到被困“O”的范围,而BFS的广阔搜索可以确保所有“O”都能得到拯救。
算法之旅:
- 从未被包围的“O”出发,使用DFS或BFS算法进行探索,标记所有可以到达的“O”。
- 遍历整个矩阵,将所有未被标记的“O”替换为“X”。
- 将步骤1中标记的“O”恢复为“O”。
代码实现:
def solve(board):
# 1. 标记可以到达的“O”
def dfs(i, j):
if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or board[i][j] != 'O':
return
board[i][j] = 'M' # 标记为已访问
dfs(i+1, j)
dfs(i-1, j)
dfs(i, j+1)
dfs(i, j-1)
# 遍历矩阵,标记可以到达的“O”
for i in range(len(board)):
dfs(i, 0)
dfs(i, len(board[0])-1)
for j in range(1, len(board[0])-1):
dfs(0, j)
dfs(len(board)-1, j)
# 2. 将未被标记的“O”替换为“X”
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] == 'O':
board[i][j] = 'X'
# 3. 将步骤1中标记的“O”恢复为“O”
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] == 'M':
board[i][j] = 'O'
浴火重生:
通过这套算法,我们终于拯救了那些身处险境的“O”,让它们重获生机。矩阵中那些曾被“X”包围的区域,如今已恢复了它们本来的面貌,焕发出新的活力。
结语:
LeetCode 130题的求解之旅,是一次精彩的算法探索。我们不仅掌握了两种强大的搜索算法,还学会了如何将它们巧妙地结合起来,解决现实世界中的问题。希望这份攻略能让你在未来的算法挑战中披荆斩棘,所向披靡!