QOJ.ac

QOJ

Límite de tiempo: 2000 s Límite de memoria: 262144 MB Puntuación total: 100 Hackeable ✓

#419. 多米诺骨牌平铺

Estadísticas

在这个问题中,你需要通过沿着循环移动多米诺骨牌,将矩形的一种多米诺骨牌平铺方式转换为另一种。

考虑一个大小为 $h \times w$ 的矩形网格。多米诺骨牌(或简称骨牌)是一个矩形块,可以放置在网格中任意两个相邻的单元格上。网格的平铺是指一组骨牌,使得网格的每个单元格都被集合中的恰好一块骨牌覆盖。注意,骨牌不能跨越网格边界。

给定两种网格的平铺方式:初始平铺和目标平铺。你的任务是将初始平铺转换为目标平铺。为了实现这一点,你可以进行移动操作。单次移动包括选择一个骨牌循环并沿着该循环移动骨牌(正式定义见下文)。每次移动的代价是相应骨牌循环中的单元格数量。转换的总代价是你所做所有移动的代价之和。当然,总代价必须尽可能小。

现在,详细说明如下。

定义给定平铺上的正长度 $n$ 的骨牌循环。考虑一个由 $2n$ 个不同单元格组成的环形序列,使得序列中任意两个相邻单元格共享一条公共边。这里,“环形”意味着序列的第一个和最后一个单元格也被视为相邻。显然,这样的序列中有 $2n$ 对相邻单元格。用 $n$ 个互不重叠的骨牌覆盖其中的 $n$ 对,就得到了一个骨牌循环。

沿着循环移动骨牌的过程会导致平铺方式的改变。首先,移除覆盖属于该循环的所有 $2n$ 个单元格的 $n$ 个骨牌。之后,添加 $n$ 个新的互不重叠的骨牌来覆盖另外 $n$ 对相邻单元格。可以很容易地看出,由此产生的骨牌集合也是一种平铺。回想一下,这种移动的代价是 $2 \cdot n$。

输入格式

输入的第一行包含两个整数 $h$ 和 $w$,由空格分隔:矩形网格的高度和宽度($1 \le h, w \le 100$)。

接下来的 $h$ 行,每行包含 $w$ 个字符,描述初始平铺。每个字符都是以下之一: 字符 “l” 表示骨牌的左半部分, 字符 “r” 表示骨牌的右半部分, 字符 “u” 表示骨牌的上半部分, 字符 “d” 表示骨牌的下半部分。

接下来是一行包含 $w$ 个短横线(“-”)。

接下来的 $h$ 行,每行包含 $w$ 个字符,以相同的方式描述目标平铺。

保证输入是一致的: $h$ 和 $w$ 的选择使得 $h \times w$ 网格的平铺是可能的,并且 保证每种平铺中的每个字符在所需方向上都有所需的邻居。

输出格式

在输出的第一行,写入两个由空格分隔的整数:$m$(移动次数)和 $p$(转换的总代价)。注意,只要代价 $p$ 是最小可能的,移动次数 $m$ 可以是任意的。

接下来的 $m$ 行必须描述移动,每行一次移动。沿着包含 $k$ 个单元格的骨牌循环的移动必须写为 $k \ r_1 \ c_1 \ r_2 \ c_2 \dots r_k \ c_k$。其中,$r_i$ 和 $c_i$ 是循环中第 $i$ 个单元格的坐标。用一个或多个空格分隔行上的连续标记。你可以从循环中的任何点开始,并沿任一方向遍历它。

样例

样例输入 1

3 4
lrlr
ulru
dlrd
----
ulru
dlrd
lrlr

样例输出 1

1 10
10 1 1 1 2 1 3 1 4 2 4 3 4 3 3 3 2 3 1 2 1

样例输入 2

2 6
uuuuuu
dddddd
------
lrlrlr
lrlrlr

样例输出 2

3 12
4 1 1 2 1 2 2 1 2
4 1 3 2 3 2 4 1 4
4 1 5 2 5 2 6 1 6

说明

在第一个样例中,最小总代价为 10。它可以通过仅一次移动来实现,该移动涉及网格的 10 个边界单元格,按循环顺序排列。覆盖单元格 $(1, 1)$ 和 $(1, 2)$,$(1, 3)$ 和 $(1, 4)$,$(2, 4)$ 和 $(3, 4)$,$(3, 3)$ 和 $(3, 2)$,$(3, 1)$ 和 $(2, 1)$ 的五个骨牌被移除。之后,添加覆盖单元格 $(1, 2)$ 和 $(1, 3)$,$(1, 4)$ 和 $(2, 4)$,$(3, 4)$ 和 $(3, 3)$,$(3, 2)$ 和 $(3, 1)$,$(2, 1)$ 和 $(1, 1)$ 的新骨牌。

在第二个样例中,最小总代价为 12。它可以通过沿着三个小循环移动骨牌来实现,每个循环包含四个单元格。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.