我查看过类似问题的先前问题,但我有一个与此算法相关的具体问题。问题陈述(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参数作为布尔值来判断单词是上升还是下降,但这对我来说似乎不可行。
任何人都有关于如何保持方向性的想法?
答案 0 :(得分:0)
一般情况下,您需要将词典视为 word 单位,并处理网格(这是您maze
的交叉主义者的术语)将整个单词作为一个单元插入的例程。
您需要解析"网格以识别所有可用位置。
将函数写入match
一个单词到可用位置,反之亦然。位置包括起始方(行,列),方向(布尔)和字母模式(空格,除非填充了交叉字)。 match
会考虑字长和已填写的任何方格。
现在,您可以依次迭代放置每个单词,或填充每个网格位置。致电match
,直至找到填写单词的地方。如果找不到,则当前网格填充不会导致解决方案;回溯一个单词然后再试一次。当您找到一个点时,填写单词(另一个函数),使用现在填充的字母更新任何交叉位置,然后转到迭代中的下一个单词或位置。
如果你成功结束,你就有了一个完整的谜题。
这会让你感动吗?