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

时间:2014-06-24 22:29:36

标签: algorithm

我正在为我国的ACM比赛做准备而且我很困惑这个问题,我不知道使用什么算法......

问题是: 给定一个拼图模式,您需要告诉它是否只能通过使用具有L形的碎片来构建(如右下图所示)。 http://mendo.mk/task_files/puzzle.png

所以在这个例子中答案是YES,因为左边的图案可以由这件作品构成。碎片总是相同的,输入中给出了模式。

以下是约束

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

实施例

input                output
2                    NO
3 3                  YES
W.. 
RW.  
WRW  
3 4  
RWW.  
WWRW  
..WR

3 个答案:

答案 0 :(得分:3)

  1. 你知道是否有N个红点,必须有2N个白点。
  2. 每个红点位于L形;你只需要确定方向
  3. 某些L形的选择数量会比其他形状更有限(例如,角落中的红点只能有1个方向的L)。如果你&#34;放置&#34;根据它们有多少可能的方向(从小到大),你可以限制可能的数量。
  4. 如果模式是(或变为)不相交,则可以按某种顺序独立地解决每个断开的部分(而不是在部分之间进行弹跳)。可能不值得去检测这种情况,尽管如果你能部分放到导致这样的划分,这可能有助于加快速度。

答案 1 :(得分:2)

在一般情况下,这对于这个大小来说是无法解决的暴力问题,但提示是他们给了你一个额外的约束(红色方块),这实际上简化了问题。

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

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

  • 您可以选择占据红色方块左侧的方块或红色方块右侧的方块。
  • 您可以选择占据红色正方形上方或下方的正方形。

这些都是独立的,它们每个都可以用二进制变量表示。从那里,您可以看到与附近可能出现的红色方块发生碰撞的位置,并形成二进制逻辑语句,然后将其输入2-SAT求解器。

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

答案 2 :(得分:0)

我认为合理的方法是使用memoization

这是一个算法: -

  
      
  1. 选择放置L的位置。
  2.   
  3. 通过删除占用的位置递归评估拼图的下一个配置。
  4.   
  5. 在hashmap hash中存储递归调用的结果(Grid)=&gt; true / false,hashmap存储拼图配置是否可以解决。
  6.   
  7. 在新的调用之后检查调用是否已经在hashmap中完成,如果直接从hashmap返回结果。
  8.