【问题标题】:Word search puzzle - the exact character can appear only in one word单词搜索难题 - 确切的字符只能出现在一个单词中
【发布时间】:2022-11-06 01:31:07
【问题描述】:

我正在尝试解决单词搜索难题,但是,我不确定最有效的方法是什么。我知道如何search a word in a 2D grid of characters,但我有一个额外的条件,即确切的字符只能出现在一个单词中(见下图 - 用红色标记的单词 jp 不能存在,因为字母 j 已经是单词 gj 的一部分,并且p 是单词 pa 的一部分,因此单词 jp 的唯一可能位置是 (0,3),(1,3))。

一种可能的解决方案是将单词出现的所有坐标存储在一个数组中,然后使用两个 for 循环找到正确的位置。但是,我不确定这是否是最有效的解决方案。

提前致谢!

【问题讨论】:

  • 为了确保我理解这个问题 - 目标是将网格划分为水平、垂直或对角线而不重叠?是否有任何规则来管理哪些词是合法的?
  • @templatetypedef 是的,这就是目标。单词在列表中给出,您必须在网格中找到它们。
  • 您是否熟悉确切的封面问题或跳舞链接算法?
  • 您正在使用多大的网格?
  • @templatetypedef 抱歉回复晚了。我正在阅读确切的封面问题;但是,我不确定如何使用 2D 数组来实现它(它表示给定单词的所有可能解决方案 - 例如在上面的问题中,单词 jp 的数组将是 {{(2,4),(3, 4)},{(3,0),(3,1)}})。没有网格限制。

标签: arrays algorithm time-complexity


【解决方案1】:

您可以通过使用精确覆盖问题的求解器(例如 DLX 算法)来解决此问题。这是如何做到的:

  1. 使用常规单词搜索算法在搜索网格的单词列表中查找每个单词的每个副本。
  2. 精确封面实例的基础集将包含网格中每个 (x, y) 位置的一个条目,以及每个单词 w 的一个条目一世您需要搜索的。
  3. 对于每个位置,您都可以找到一个单词 w一世在单词搜索网格中,创建一个包含 w 的集合一世,以及您在网格上找到它的每个位置。因此,例如,如果单词 w1= WORD 占据的位置 (0, 0), (1, 1), (2, 2), 和 (3, 3),你会让集合 {w1, (0, 0), (1, 1), (2, 2), (3, 3)}。

    现在,一个精确的覆盖解决方案对应于

    1. 将每个单词分配到网格中的一个位置,因为我们不能使用两个集合,每个集合都涉及相同的单词,并且必须为每个单词选择至少一个集合,并且
    2. 用一个词覆盖每个网格位置。

      如果您不需要第二个要求 - 也就是说,如果您不必用单词覆盖网格中的每个位置 - 您可以为每个位置额外添加单例集 {(x, y)}网格。现在,您的精确覆盖解决方案仍将以没有任何重叠的方式放置所有单词,并且剩余的网格位置将被单例覆盖。

      不过,您不必使用确切的掩护来执行此操作。您还可以设置一个简单的回溯递归搜索,在该搜索中选择一个单词,对于可以放置它的每个位置,递归地尝试将其放置在那里,然后用剩余的单词填充网格的其余部分。将其构建为精确覆盖问题只是利用现有求解器的一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多