使用复数遍历二维数组中的邻居

时间:2019-04-10 13:29:33

标签: python algorithm

在此解决方案中,我找到了一种通过使用复数遍历四方邻居的新方法。

https://leetcode.com/problems/word-search-ii/discuss/59804/27-lines-uses-complex-numbers

(您可以阅读我的示例。)

我认为它优雅简洁,但我无法完全理解。

在这里,我提取了关键代码,并简化了示例。

board是一个二维数组,我们要从每个节点开始,并通过dfs递归遍历4方向的neigbor:

这是一种常见的方式:

    def dfs(i, j, word):
        # create 4 direction by hand
        for I, J in (i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1):
            # need to check boundary
            if 0 <= I < len(board) and 0 <= J < len(board[0]):
                dfs(I, J, word + c)

    for i, j in board:
        dfs(i, j, '')

这里使用复数作为索引:

    board = {i + 1j * j: c
             for i, row in enumerate(board)
             for j, c in enumerate(row)}

    def dfs(z, word):
        c = board.get(z)

        # here is visit 4 direction neighbors, which I don't understand
        if c:
            for k in range(4):
                search(node[c], z + 1j ** k, word + c)

    for z in board:
        dfs(z, '')

我认为使用复数有两个优点:

  1. 不需要手动创建4个方向
  2. 不需要检查边界

但是我在这里for k in range(4): dfs(z + 1j ** k, word + c)

无法理解

有人可以解释这个算法吗?非常感谢。

1 个答案:

答案 0 :(得分:3)

如果我认为正确,那么此解决方案将使用虚数j的以下属性: j^1, j^2, j^3, j^4 = j, -1, -j, 1

如果将其添加到复数中以表示网格,则是以下节点:右,上,左,下