Ruby 算法:给出一组单词来解决纵横字谜
我看了以前类似问题的问题,但我有一个与此算法相关的具体问题。问题陈述如下: 我们为您提供了一个10x10的纵横字谜网格,以及一组需要填入网格中的单词或地名。 网格中的单元格最初是+号或-号。 标有a+的单元格必须保持原样。标记为-的单元格需要填充适当的字符 样本输入:Ruby 算法:给出一组单词来解决纵横字谜,ruby,algorithm,recursion,multidimensional-array,Ruby,Algorithm,Recursion,Multidimensional Array,我看了以前类似问题的问题,但我有一个与此算法相关的具体问题。问题陈述如下: 我们为您提供了一个10x10的纵横字谜网格,以及一组需要填入网格中的单词或地名。 网格中的单元格最初是+号或-号。 标有a+的单元格必须保持原样。标记为-的单元格需要填充适当的字符 样本输入: +-++++++++ +-++++++++ +-++++++++ +-----++++ +-+++-++++ +-+++-++++ +++++-++++ ++------++ +++++-++++ +++++-++++ LONDO
+-++++++++
+-++++++++
+-++++++++
+-----++++
+-+++-++++
+-+++-++++
+++++-++++
++------++
+++++-++++
+++++-++++
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参数作为布尔值来表示单词是向上还是向下,但这对我来说似乎不可行
有人知道如何保持方向性吗?一般来说,你需要将词典作为单词单元来处理,并处理网格,这是十字架上的单词,它是你迷宫中的术语,通过例行程序将整个单词作为一个单元插入 您需要解析网格以识别所有可用位置。 编写一个函数,将单词与可用位置匹配,反之亦然。位置由起始方行、列、方向布尔和字母模式空格组成,除非已经填充了交叉词。匹配将考虑字长和任何已填充的方块。 现在,您可以依次迭代放置每个单词,或填充每个网格位置。打电话给match,直到你找到一个填单词的地方。如果未找到,则当前栅格填充不会导致解决方案;回溯一个单词,然后重试。当您找到一个位置时,填写单词“另一个函数”,用现在填充的字母更新任何交叉位置,然后转到迭代中的下一个单词或位置 如果你成功到达终点,你就完成了一个拼图
这会让你行动起来吗?你可以使用递归来解决这个问题。在每个可行的位置放置第一个单词。对于每个单词,将第二个单词放在每个可行的位置。对于第一个和第二个单词的每个配对,将第三个单词放在每个可行的位置。您的递归方法可能是递归编写的,部分填充的交叉字,剩余的交叉字,两个参数都是数组,返回一个表示完整的交叉字数组的数组,如果搜索树的该部分不存在有效的完整纵横字谜,则为零。代码将使这是一个更有用的答案。@CarySwoveland:我觉得设计数据结构和提供工作代码将远远超出SO的一般用途。我同意OP的说法,张贴的代码是无效的攻击;适当的修改是一个大的重写。我不是批评你的答案,只是强调代码对OP和其他读者会更有帮助。人们经常看到的答案可能被认为远远超出了SO的一般目的,但仍然值得赞赏。您能否对匹配方法进行更多的扩展?@Sunny:此时,您已经解析了网格以查找所有位置。您可以方便地存储这些内容,例如一个数组,它的每个条目都包含一个长度和当前的字母模式。您现在必须编写一个match方法,该方法将返回与给定单词匹配的所有位置:相同的长度,并且没有冲突的字母。