我正在为我国的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
答案 0 :(得分:3)
答案 1 :(得分:2)
在一般情况下,这对于这个大小来说是无法解决的暴力问题,但提示是他们给了你一个额外的约束(红色方块),这实际上简化了问题。
这是一个2-SAT问题,有一个非常简单的教科书算法。
诀窍是将问题建模为2-SAT问题。基本上,如果你注意到,一旦你在红色方块上放置一个“L形”,你就有2个独立的选择:
这些都是独立的,它们每个都可以用二进制变量表示。从那里,您可以看到与附近可能出现的红色方块发生碰撞的位置,并形成二进制逻辑语句,然后将其输入2-SAT求解器。
请注意,您还需要进行一些额外的检查,例如:白色方块的数量必须恰好是每个连接组件中红色方块数量的两倍。
答案 2 :(得分:0)
我认为合理的方法是使用memoization。
这是一个算法: -
- 选择放置L的位置。
- 通过删除占用的位置递归评估拼图的下一个配置。
- 在hashmap hash中存储递归调用的结果(Grid)=&gt; true / false,hashmap存储拼图配置是否可以解决。
- 在新的调用之后检查调用是否已经在hashmap中完成,如果直接从hashmap返回结果。
醇>