返回

难题求解:破解LeetCode 130,围困中的希望

见解分享

困局初现:
当我们审视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”都能得到拯救。

算法之旅:

  1. 从未被包围的“O”出发,使用DFS或BFS算法进行探索,标记所有可以到达的“O”。
  2. 遍历整个矩阵,将所有未被标记的“O”替换为“X”。
  3. 将步骤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题的求解之旅,是一次精彩的算法探索。我们不仅掌握了两种强大的搜索算法,还学会了如何将它们巧妙地结合起来,解决现实世界中的问题。希望这份攻略能让你在未来的算法挑战中披荆斩棘,所向披靡!