【问题标题】:Algorithm to find word on Boggle board在 Boggle 板上查找单词的算法
【发布时间】:2009-08-06 03:03:27
【问题描述】:
我正在 vb .net 中构建一个 boggle 游戏。现在,我的骰子是二维数组 (0,0 0,1 ) 等...
我想要它做的是,当我输入这个词时,它会使用突出显示它的button(x,y).doclick sub 在板上突出显示它。现在我的实现找到了第一个字母,然后继续尝试每个字母,直到它满足 8 个角条件(即它与最后一个相邻),但这并不总是有效。如果板上有 2 个“G”,而我想要底部的一个,这将行不通。有人可以给我一个需要发生什么的伪代码示例。我已经被难住了将近 6 个小时试图弄清楚这一点。谢谢
【问题讨论】:
标签:
vb.net
algorithm
boggle
【解决方案1】:
如果我理解正确,给定一个字符串,您想突出显示与该字符串匹配的骰子的一条路径。有时有几种可能的选择,因此添加一个字母可能会完全改变突出显示的内容。在这里保留前一个子字符串的结果可能是一个好方法,所以我们不必重新开始。那么一个合理的做法是计算所有可能的路径。
给定字符串 s 的答案是路径列表,其中路径是网格坐标列表。每条路径都是您可以合理突出显示的内容,因此您只需突出显示第一个路径。向字符串添加字母时,您会找到可以扩展的路径并删除无法扩展的路径。
恐怕我不会写vb代码。由于您要求提供伪代码,因此这里有一些类似 Python 的粗略伪代码。我将 boggle 网格编码为 16 个项目的列表。 neighbors(x) 函数返回相邻位置的列表(边缘情况除外,即 [x-1, x+1, x-4, x+4])。
def firstLetter(typed):
answer = []
for pos in range(16): if grid[pos]==typed: answer += [pos]
return answer
def addletter(partialanswer, typed):
answer2 = []
for partial in partialanswer:
for neighbor in neighbors(partial[-1]):
if grid[neighbor]==typed:
# partial+[neighbor] is a list. answer2 is a list of such lists.
answer2 += partial + [neighbor]
return answer2
例如,如果玩家输入“go”,那么
(a) 玩家键入“g”,代码调用 firstletter(“g”) 并获取网格中包含“g”的位置的列表“答案”。突出显示,比如说,第一个。
(b) 玩家键入“o”,代码调用 addletter(answer, "o") 并获取网格中显示“go”的路径列表。再次突出显示第一个。