在这个问题中,你需要通过沿着循环移动多米诺骨牌,将矩形的一种多米诺骨牌平铺方式转换为另一种。
考虑一个大小为 $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。它可以通过沿着三个小循环移动骨牌来实现,每个循环包含四个单元格。