如何搜索4x4随机字母网格(A-Z)中是否存在单词。如果有人引导我找到解决此问题的有效方法的正确方向。
以下是条件:
感谢您的帮助!
答案 0 :(得分:2)
您可以将此视为图形问题。将网格转换为图形,其中每个顶点表示网格中的单元格,顶点之间的边缘表示这些单元格之间的有效移动。
从那里,您可以使用以下递归算法来确定是否可以在图G中找到单词S:
FindWord(G, S): 1. Set C to the first letter of S. 2. Set S' to S with the first letter removed. 3. For all vertices V in G: 3.1. If the letter in V is not C, continue to the next vertex. 3.2. If CheckPaths(G, S', V, {}) returns true, return true. 4. Return false. CheckPaths(G, S, V, Visited): 1. If S is empty, return true. 2. Set C to the first letter of S. 3. Set S' to S with the first letter removed. 4. Set Visited' to Visited ∪ {V}. 5. For all cells V' connected to V: 5.1. If V' ∈ Visited, continue to the next vertex. 5.2. If the letter in V' is not C, continue to the next vertex. 5.3. If CheckPaths(G, S', V', Visited') returns true, return true. 6. Return false.
实际实现可能会略有不同(例如,最好不要复制Visited,但在确定路径失败后通过删除顶点来共享单个集合),但这是基本的如何做到的想法。
答案 1 :(得分:1)
如果您只是在使用4X4网格,那应该非常简单。扫描单词的第一个字母,并在每个方向搜索该单词是否可以从网格中完成。
如果网格非常大和/或您正在执行大量搜索,则可能需要先对网格进行预处理。例如。对于每两个字符(让我们称之为k-gram,因为通常你想跟踪k个字符),你可以保留它们所在位置的列表。在搜索时,首先要查找该单词的k-gram位置。
答案 2 :(得分:1)
我首先要表示一个既有字母又有空格的网格。
我会编写一个例程,它将一个像这样的网格和一个起始字母作为参数,并返回一个可能的单词列表。
我会编写一个迭代器,对于这样的网格,每个字母都会返回给定的字母。它会识别空格而不会返回它们。
我会编写一个例程,用一个字母和我的网格,从网格中删除字母,并且对于每个相邻的字母,用新网格和新字母调用自己。
如果你真的想要搜索一个单词,可以将它传递给这些例程,这样一旦你有不匹配就会失败。
否则,您可以使用它来生成完整的单词列表。