Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 算法:给出一组单词来解决纵横字谜_Ruby_Algorithm_Recursion_Multidimensional Array - Fatal编程技术网

Ruby 算法:给出一组单词来解决纵横字谜

Ruby 算法:给出一组单词来解决纵横字谜,ruby,algorithm,recursion,multidimensional-array,Ruby,Algorithm,Recursion,Multidimensional Array,我看了以前类似问题的问题,但我有一个与此算法相关的具体问题。问题陈述如下: 我们为您提供了一个10x10的纵横字谜网格,以及一组需要填入网格中的单词或地名。 网格中的单元格最初是+号或-号。 标有a+的单元格必须保持原样。标记为-的单元格需要填充适当的字符 样本输入: +-++++++++ +-++++++++ +-++++++++ +-----++++ +-+++-++++ +-+++-++++ +++++-++++ ++------++ +++++-++++ +++++-++++ LONDO

我看了以前类似问题的问题,但我有一个与此算法相关的具体问题。问题陈述如下:

我们为您提供了一个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参数作为布尔值来表示单词是向上还是向下,但这对我来说似乎不可行


有人知道如何保持方向性吗?

一般来说,你需要将词典作为单词单元来处理,并处理网格,这是十字架上的单词,它是你迷宫中的术语,通过例行程序将整个单词作为一个单元插入

您需要解析网格以识别所有可用位置。 编写一个函数,将单词与可用位置匹配,反之亦然。位置由起始方行、列、方向布尔和字母模式空格组成,除非已经填充了交叉词。匹配将考虑字长和任何已填充的方块。 现在,您可以依次迭代放置每个单词,或填充每个网格位置。打电话给match,直到你找到一个填单词的地方。如果未找到,则当前栅格填充不会导致解决方案;回溯一个单词,然后重试。当您找到一个位置时,填写单词“另一个函数”,用现在填充的字母更新任何交叉位置,然后转到迭代中的下一个单词或位置

如果你成功到达终点,你就完成了一个拼图


这会让你行动起来吗?

你可以使用递归来解决这个问题。在每个可行的位置放置第一个单词。对于每个单词,将第二个单词放在每个可行的位置。对于第一个和第二个单词的每个配对,将第三个单词放在每个可行的位置。您的递归方法可能是递归编写的,部分填充的交叉字,剩余的交叉字,两个参数都是数组,返回一个表示完整的交叉字数组的数组,如果搜索树的该部分不存在有效的完整纵横字谜,则为零。代码将使这是一个更有用的答案。@CarySwoveland:我觉得设计数据结构和提供工作代码将远远超出SO的一般用途。我同意OP的说法,张贴的代码是无效的攻击;适当的修改是一个大的重写。我不是批评你的答案,只是强调代码对OP和其他读者会更有帮助。人们经常看到的答案可能被认为远远超出了SO的一般目的,但仍然值得赞赏。您能否对匹配方法进行更多的扩展?@Sunny:此时,您已经解析了网格以查找所有位置。您可以方便地存储这些内容,例如一个数组,它的每个条目都包含一个长度和当前的字母模式。您现在必须编写一个match方法,该方法将返回与给定单词匹配的所有位置:相同的长度,并且没有冲突的字母。