我正在以编程方式解决Boggle游戏并注意到Depth First Search可用于查找棋盘中所有有效的字母组合。描述了一个Boggle板here。
假设我们有4x4板。对于电路板上的每个字符,使用DFS查找电路板中的所有路径(唯一的规则是您不能多次使用单个字符)。当Boggle板不是真正的图形时,为什么DFS适用于此?此外,DFS应用于哪些其他类型的问题与此用法类似?
答案 0 :(得分:0)
您可以应用DFS或其他图形算法,因为您基本上也可以在grid graph上使用对角线。
把你的字母而不是点放在你的图表上。现在为什么DFS会在这里工作?
在此游戏中创建单词时 - 连接相邻顶点,从而在图形上创建路径。所以这是一种方法,你可以从(并改进)开始。
N
个字符)N
。对于每个单词(规则中大于3),检查它是否在字典中,如果是 - 将它们保存在某处。您可以看到,在我的图表中,您可以轻松找到单词TORUS
。
为什么使用DFS而不是BFS是有意义的?有几个原因:
我的算法的复杂性是什么
假设您有一个网格n * m
,最长的单词的长度为d
。因为在我的算法中你从所有顶点实现DFS,并且DFS的复杂度是O(b ^ d),其中平均分支略小于8(可能甚至小于7,因为你不能在这里有循环)。在集合id(1)中搜索。因此复杂性为m * n * 8^d
。
如何改进?尝试搜索单词TLRSOU
没有多大意义,因为英语字母表中没有以TLR
开头的单词。因此,更好的想法是将单词存储在trie中并快速终止那些没有意义的分支。
答案 1 :(得分:0)
那是因为它是(或可以)由图表表示。 Boggle单词由水平,垂直或对角线相邻的字母组成。因此,您可以按照此规则制作字母之间的连接图。此外,DFS不会访问节点两次,因为它会保留已访问过的节点列表。所以它满足了另一个规则,即一个字母只能使用一次。
DFS(以及BFS)最终会发现图中的每条路径,因此您可以将生成的路径列表与有效字词的字典进行比较,以确定单个Boggle板上的有效字总数。
最着名的DFS用途当然是寻路 - 几乎任何空间都可以映射到图形中,然后找到最短或最长的路径。 DFS可以很好地找到图的半径,从而找到最中心的节点。这对于洪水填充算法非常有用,在这种算法中,您希望快速填充不规则形状的内部,因为从图形中心开始边缘扩展将发生得最快。