我开玩笑的想法是制作一个程序,该程序采用当前的拼字游戏或类似的文字游戏,并输出一个玩家可以根据他或她的信件做出的可能移动的列表。说我们有以下内容:
C
Hello
E
S
S
这可以是2D字符数组,也可以是带有边和顶点(字母)的图形结构。我对如何处理这个问题有一个强烈的想法,我将详细说明如下:
您有5个字母,L_1到L_5,并希望收到单词列表和开始/结束位置。防爆。 {" WordName",position_i(x,y),结束于position_j(x,y)}。
如果我们只考虑一个可能的起始位置,直接说到CHESS中最后一个S的左边,我们用表达式"?S?...?"来查询我们的字典。和我们可用字母的哈希结构。我想象字典检查这个表单的每个单词,并且该单词完全由S和散列字符组成。此搜索是O(Dictionary_Length)。我们可以在这里进行优化,通过O(D_L)传递仅查找带有第二个字母S的单词,然后检查字符。
现在我们找到了从该位置开始的所有单词,我们必须考虑其他所有合法位置......这是国际象棋中最后一个S的左边两个,然后是三个,然后是左边四个(我们只有5个字母,因此在连接字母的法律委员会中不可能创建超过5个字母。然后,当然,考虑S作为第一个字母。然后,向上移动到第一个S并重复。然后是E,在Hello之前,在C之前。然后我们考虑自上而下,制作像????? CHESS ?????或e,l,l或o之上的单词。这是一个棘手的事情,因为我们必须考虑每个可能的起点。如果我们的三封信是" C,O,L"例如,我们可以在o上面两个以上,然后下去制作CoOL,我们可以根据需要计算得分。
我的问题是,如果有任何明显的优化或修剪我可以做以避免检查无结果的位置?显然有启发式,如"如果第二个字母不是元音,那么可能的单词就会少得多。这将允许我为这种情况创建字典的子集。
此外,这是一个非常简单的电路板,更大更复杂的电路板将有更多的起始位置。每次扫描理论上都需要O(Dict_Len),我们做...最坏的情况,平均字的长度* num字*起始字符起始位置(每个单词字母一个,每个字,每个单位,以容纳你的一些或全部字母)。这似乎相当昂贵。无论如何,这只是一个有趣的想法,我对任何见解感到好奇!谢谢:)
答案 0 :(得分:0)
任何完成此操作的算法都会非常缓慢(请参阅有关NP-hard的评论等)。找到一些更简单的匹配的启发式算法当然是可能的,但是考虑找到正确的匹配来完成这项工作可能需要做多少工作:
P
U E
REFUSALS
P O T E
L O I M
E D M A
A N
T T
E I
C
S
进入这个:
P
U E
REFUSALS
P O T E
ALGORITHM
E D M A
A N
T T
E I
C
S
显然,更复杂的例子是可能的,难以成为指数级的难度......