Python:在字符矩阵中查找单词

Python:在字符矩阵中查找单词,python,matrix,Python,Matrix,我正在尝试创建一个文字游戏,其中包括在5x5个字符的矩阵中查找文字,如下所示: [['a', 'a', 'u', 'r', 'a'], ['m', 'v', 'g', 'n', 'x'], ['a', 'q', 'h', 'y', 'o'], ['p', 'r', 'h', 'l', 'h'], ['v', 'h', 'y', 'o', 'j']] 我将其表示为一个列表列表。应该找到“xylon”,但不能找到“nylon”,因为它重复使用了“n”。我发现了一个类似的问题,但我不知道C

我正在尝试创建一个文字游戏,其中包括在5x5个字符的矩阵中查找文字,如下所示:

[['a', 'a', 'u', 'r', 'a'],
 ['m', 'v', 'g', 'n', 'x'],
 ['a', 'q', 'h', 'y', 'o'],
 ['p', 'r', 'h', 'l', 'h'],
 ['v', 'h', 'y', 'o', 'j']]
我将其表示为一个列表列表。应该找到“xylon”,但不能找到“nylon”,因为它重复使用了“n”。我发现了一个类似的问题,但我不知道C

我目前的解决方案是为单词中的每个字母创建一个字典,由它在黑板上的位置元组列表组成,如:{'letter':[(行,列),(行,列)]}。然后,对于单词中的每个字母,我检查它在黑板上的每个位置是否与前一个字母的位置兼容。如果是,我将该位置添加到新的路径字典中

但对于重复字母和其他情况(如“尼龙”返回真值)来说,这是失败的。它已经相当庞大和混乱,我可能应该重新开始。有没有更简洁的解决方案 编辑:

澄清:如果存在一条路径连接网格中单词中的每个字母,则单词“在”网格中。允许上、下、左、右和对角线。”x'与y相邻,y与l相邻,依此类推。只要每个字母相邻,并且电路板上没有特定的字母被使用两次,路径就不需要有特定的形状。一个单词可以有重复的字母,所以可以使用“pama”,因为可以使用多个“A”


@MSW是正确的,游戏是正确的,尽管我是第一次发现这一点

如果您想检查单词成员资格,那么将字母映射到位置的词典的起点是一个很好的起点:

letter_positions = {}
for (y, row) in enumerate(board):
    for (x, letter) in enumerate(row):
         letter_positions.setdefault(letter, []).append((x, y))
从这里开始,您的函数应该跟踪哪些字母已经被使用,以确保不会重复:

def move_valid(position, last_position):
    if last_position is None:
        return True
    return (
        abs(position[0] - last_position[0]) <= 1 and
        abs(position[1] - last_position[1]) <= 1
    )

def find_word(word, used=None):
    if word == "":
        return []
    if used is None:
        used = []
    letter, rest = word[:1], word[1:]
    for position in letter_positions.get(letter) or []:
        if position in used:
            continue
        if not move_valid(position, used and used[-1]):
            continue
        path = find_word(rest, used + [position])
        if path is not None:
            return [position] + path
    return None

现在,请注意,这里的运行时将是
O(不太好)
,因为used中的
位置(
used
是一个列表,需要对每个字母位置进行
O(N)
搜索)和
used+[position]
[position]+path
(每个都将导致分配+复制)。在实践中,这将是~
O(字长^2)
,但可以改进为~
O(字长)
,使用一些更合理的数据结构。

澄清一下,我是否会键入一个类似单词的地图,然后它检查是否在网格中?您确实编写了一个小函数,确保猜出的单词中每个字母的
计数
。如果是,则返回
True
,否则
False
单词“在”网格中意味着什么?它看不出说“xylon”的逻辑是什么。@JohnColeman'x'和'n'在同一行中xylon@helloV这加深了谜团。没有一个单词搜索路径会给出“xylon”。我可以很清楚地看到所有的字母都在网格中,但是网格结构本身似乎不相关。我唯一要做的就是将
如果last\u position为None
更改为
如果last\u position=[]
,因为当使用时,
used和used[-1]
返回的是一个空列表。很抱歉评论延迟,我是一个初学者,花了几天时间才理解这段代码的复杂性。我感谢你的帮助!
>>> find_word("xylon")
[(4, 1), (3, 2), (3, 3), (4, 2), (3, 1)]
>>> find_word("bad")
None