我有一个填字游戏的2D数组:
0 1 2 3 4
0 t h i s q
1 m i l e u
2 a b y w i
3 n b y s c
4 l o o t k
给出一个要查找的单词列表:这个,快速,战利品,英里,按人,
目标: 在任何方向(水平,垂直,对角线)中找到拼图中的单词
输出: 是列出单词所在的所有点。 例如,这:(0,0),(0,1),(0,2),(0,3)
我在开始这方面遇到了麻烦。
答案 0 :(得分:0)
像这样的东西。可能需要一些修复,但一般情况下:
find_word(x,y,word,index,inc_x,inc_y):
if x,y is not on board return false
if letter[x,y] != word[index] return false
if it is last letter return true
call find_word(x+inc_x,y+inc_y,word,index+1,inc_x,inc_y)
foreach x:
foreach y
foreach word
for x_inc in -1,0,1
for y_inc in -1,0,1
if x_inc + y_inc == 0 continue
find_word(x,y,word,0,x_inc,y_inc)
如果你想比制作一个单词树更快,你可以删除单词循环。 例如,想象你有:abc,aab,aac。
a
a
b
c
b
现在想象你找到了一封信。 拨打find_word并获取前面的字母d。在树的a中没有d,所以找不到任何单词。 拨打find_word并获取前一个字母a。现在将单词的搜索范围缩小到a的子树。
因此你可以从w * h * num_words * max_length只到w * h * max_length。