算法:给出一个单词列表

时间:2017-07-13 21:15:48

标签: ruby algorithm recursion multidimensional-array

我查看过类似问题的先前问题,但我有一个与此算法相关的具体问题。问题陈述(https://www.hackerrank.com/challenges/crossword-puzzle/problem)如下:

为您提供10x10填字游戏网格,以及需要填充到网格中的一组单词(或地点名称)。 网格中的单元格最初是+符号或 - 符号。 标有+的细胞必须保持原样。标有a的单元格需要填充适当的字符。

示例输入:

+-++++++++
+-++++++++
+-++++++++
+-----++++
+-+++-++++
+-+++-++++
+++++-++++
++------++
+++++-++++
+++++-++++
LONDON;DELHI;ICELAND;ANKARA

对应输出:

+L++++++++
+O++++++++
+N++++++++
+DELHI++++
+O+++C++++
+N+++E++++
+++++L++++
++ANKARA++
+++++N++++
+++++D++++

我错误地写出了一个没有完全理解问题的算法,我只是将下一个可用的字母放在一个空位并以这种方式解决迷宫(这里是我的代码):

 def populate_grid(maze, locations)
     maze.each_index do |row|
         maze[row].each_index do |col|
             if maze[row][col] == "-"
                 maze[row][col] = locations.first[0]
                 if locations.first.length == 1
                     locations.shift # remove this location altogether
                 else
                    locations[0] = locations[0][1...locations.first.length]
                 end
                 populate_grid(maze, locations)
             end
         end
     end
 end

不幸的是,没有为这个问题提供解决方案,我想知道如何建立每个单词的一致方向性(例如,仅在水平/垂直方向上)。我想过使用3参数作为布尔值来判断单词是上升还是下降,但这对我来说似乎不可行。

任何人都有关于如何保持方向性的想法?

1 个答案:

答案 0 :(得分:0)

一般情况下,您需要将词典视为 word 单位,并处理网格(这是您maze的交叉主义者的术语)将整个单词作为一个单元插入的例程。

您需要解析"网格以识别所有可用位置。 将函数写入match一个单词到可用位置,反之亦然。位置包括起始方(行,列),方向(布尔)和字母模式(空格,除非填充了交叉字)。 match会考虑字长和已填写的任何方格。

现在,您可以依次迭代放置每个单词,或填充每个网格位置。致电match,直至找到填写单词的地方。如果找不到,则当前网格填充不会导致解决方案;回溯一个单词然后再试一次。当您找到一个点时,填写单词(另一个函数),使用现在填充的字母更新任何交叉位置,然后转到迭代中的下一个单词或位置。

如果你成功结束,你就有了一个完整的谜题。

这会让你感动吗?