Algorithm ACM:创建给定拼图形状的图案

Algorithm ACM:创建给定拼图形状的图案,algorithm,Algorithm,我正在为我的国家的ACM竞赛做准备,我被这个问题困住了,我也不知道该用什么算法 问题是: 给定一个拼图模式,你需要知道它是否只能通过使用带有L形的拼图来构建(如下图所示)。 (来源:) 所以在这个例子中,答案是肯定的,因为左边的图案可以由这件作品构成。作品总是一样的,图案在输入中给出 以下是限制条件 Input The first line of input contains one positive integer T (1 <= T <= 100), the number

我正在为我的国家的ACM竞赛做准备,我被这个问题困住了,我也不知道该用什么算法

问题是: 给定一个拼图模式,你需要知道它是否只能通过使用带有L形的拼图来构建(如下图所示)。
(来源:)

所以在这个例子中,答案是肯定的,因为左边的图案可以由这件作品构成。作品总是一样的,图案在输入中给出

以下是限制条件

Input  
The first line of input contains one positive integer T (1 <= T
 <= 100), the number of test cases.

Each test case starts with a line that contains two integers H and W
(1 <= H, W <= 500), which represent the height and width of the grid
containing the pattern. The following H lines, each containing W
characters, denote the grid. Each character is either 'R' (red), 'W'
(white) or '.' (empty space). Each grid contains at least one 'R' or
'W' character.  

Output  
For each test case, on a separate line, output either 'YES' if
it is possible to construct the pattern with the puzzle pieces, or
'NO' otherwise.

Constraints  
Time limit: 15 seconds  
Memory limit: 64 megabytes
  • 你知道如果有N个红点,那么一定有2N个白点
  • 每个红点位于一个L形;你只需要确定方向
  • 与其他L形相比,某些L形的选择数量更为有限(例如,角点中的红点只能有一个方向为1的L)。如果你“放置”工件的顺序取决于它们有多少可能的方向(从小到大),你可以限制要考虑的可能性的数量
  • 如果图案不相交(或变得不相交),则可以按某种顺序独立求解每个断开的截面(而不是在截面之间反弹)。可能不值得去检测这样的事件,尽管如果你可以放置碎片来造成这样的分裂,这可能有助于加快速度
  • 你知道如果有N个红点,那么一定有2N个白点
  • 每个红点位于一个L形;你只需要确定方向
  • 与其他L形相比,某些L形的选择数量更为有限(例如,角点中的红点只能有一个方向为1的L)。如果你“放置”工件的顺序取决于它们有多少可能的方向(从小到大),你可以限制要考虑的可能性的数量
  • 如果图案不相交(或变得不相交),则可以按某种顺序独立求解每个断开的截面(而不是在截面之间反弹)。可能不值得去检测这样的事件,尽管如果你可以放置碎片来造成这样的分裂,这可能有助于加快速度

  • 我认为应该采用一种合理的方法

    下面是一个算法:-

  • 选择要放置L的位置
  • 通过擦除占据的位置,递归地评估拼图的下一个配置
  • 将递归调用的结果存储在hashmap hash(Grid)=>true/false中,hashmap存储谜题配置是否可解
  • 在一个新的调用之后,检查该调用是否已经在hashmap中完成,如果是,直接从hashmap返回结果

  • 我认为应该采用一种合理的方法

    下面是一个算法:-

  • 选择要放置L的位置
  • 通过擦除占据的位置,递归地评估拼图的下一个配置
  • 将递归调用的结果存储在hashmap hash(Grid)=>true/false中,hashmap存储谜题配置是否可解
  • 在一个新的调用之后,检查该调用是否已经在hashmap中完成,如果是,直接从hashmap返回结果

  • 在一般情况下,这将是一个暴力问题,无法解决这种规模,但暗示是,他们给了你一个额外的约束(红方块),这实际上简化了问题

    这是一个问题,有一个非常简单的教科书算法

    诀窍是将问题建模为2-SAT问题。基本上,如果您注意到,一旦您将“L形”放置在红方块上,您有两个独立的选项:

    • 您可以选择占据红场左侧的广场或右侧的广场
    • 你可以选择占据红场上方或下方的广场
    这两个变量都是独立的,它们都可以用一个二进制变量表示。从那里,您可以看到与附近可能的红色方块发生碰撞的位置,并形成二进制逻辑语句,然后将其输入到2-SAT解算器中


    请注意,您还需要进行一些额外的检查,例如,每个连接组件中的白色方块数必须正好是红色方块数的两倍。

    在一般情况下,对于这种大小,这将是一个无法解决的蛮力问题,但提示是,它们给了您一个额外的约束(红色方块)这实际上简化了问题

    这是一个问题,有一个非常简单的教科书算法

    诀窍是将问题建模为2-SAT问题。基本上,如果您注意到,一旦您将“L形”放置在红方块上,您有两个独立的选项:

    • 您可以选择占据红场左侧的广场或右侧的广场
    • 你可以选择占据红场上方或下方的广场
    这两个变量都是独立的,它们都可以用一个二进制变量表示。从那里,您可以看到与附近可能的红色方块发生碰撞的位置,并形成二进制逻辑语句,然后将其输入到2-SAT解算器中


    请注意,您还需要进行一些额外的检查,例如,每个连接组件中的白色方块数必须正好是红色方块数的两倍。

    如果我理解正确,您建议采用蛮力方法。如果有500x500个输入,可能会有8000个左右,第一个可以用4种方式放置,第二个可以用4种方式放置…最后4种方式让我们假设你设法将8000个减少到1000个,你不知道位置在哪里,仍然是4^^1000个方式,在合理的时间内永远无法解决。我认为暴力,在一般情况下,如果您使用深度优先搜索之类的方法,则不需要使用那么多功能。决策树可能很早就被截断。@Rhymoid这不是暴力问题。即使使用optimiza,也没有办法
    input                output
    2                    NO
    3 3                  YES
    W.. 
    RW.  
    WRW  
    3 4  
    RWW.  
    WWRW  
    ..WR