【发布时间】:2017-12-18 20:24:16
【问题描述】:
我查看了类似问题的先前问题,但我有一个与此算法相关的具体问题。问题陈述(https://www.hackerrank.com/challenges/crossword-puzzle/problem)如下:
为您提供了一个 10x10 的填字游戏网格,以及一组需要填入网格的单词(或地名)。 网格中的单元格最初是 + 符号或 - 符号。 标有 + 的单元格必须保持原样。标有 - 的单元格需要用适当的字符填充。
示例输入:
+-++++++++
+-++++++++
+-++++++++
+-----++++
+-+++-++++
+-+++-++++
+++++-++++
++------++
+++++-++++
+++++-++++
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 参数作为布尔值来判断单词是上升还是下降,但这对我来说似乎不可行。
有人对如何保持方向性有想法吗?
【问题讨论】:
-
你可以使用递归来解决这个问题。将第一个单词放在每个可行的位置。对于每个,将第二个单词放在每个可行位置。对于第一个和第二个配对,将第三个单词放在每个可行位置。你的递归方法可以写成
recurse(partially_filled_crossword, remaining_words),两个参数都是数组,返回一个代表一个完整填字游戏(数组)的数组,或者nil,如果搜索树的那部分不存在有效的完整填字游戏。
标签: ruby algorithm recursion multidimensional-array