这是我正在尝试实施的游戏。 一个儿童游戏,他们在一个选定的类别中命名一个对象(说动物!) 这样玩家单词的第一个字母与前一个玩家单词的最后一个字母相同。
一个例子是:
等等!
现在,我想写一个代码,给出一个单词列表,它会找到最长的单词链。
可能的清单:
['giraffe', 'elephant', 'ant', 'tiger', 'raccoon', 'cat', 'hedgehog', 'mouse']
最长的必须是:
['hedgehog', 'giraffe', 'elephant', 'tiger', 'raccoon']
我的代码中的错误是如果我更改原始列表的顺序,最长链将有所不同! :(
这是伪代码:
function longest-chain(chain, V , longest) #Recursively return the longest chain in V
extended = False
for word in V do
if chain + word is a legal chain then
longest = longest-chain(chain + word, V / {word})
extended = True
if extended is False then # No word in V could extend chain
if chain is longer than longest then
longest = chain
return longest
(/表示设定差值运算符)
有人可以帮我正确实施吗? 我不想发布我的代码,因为我想重新开始。
答案 0 :(得分:3)
如果您将单词视为图形的顶点,则此图形的边缘位于可以连接在一起的单词之间。
cat
\
giraffe - elephant - tiger - raccoon
/ / /
hedgehog mouse ant
然后,您尝试在定向和潜在循环图中找到最长路径。它可以有多个正确的解决方案。可以用于足够小的集合的蛮力方法是枚举所有可能的路径并选择最长的路径之一。这可以通过动态编程进行优化,动态编程是缓存已计算部分的一个奇特名称。