CF2268F Deglado

题目描述

给定一个 $2n \times 2n$ 的网格 $a$,网格中的每一列都是长度为 $2n$ 的排列$^{\text{∗}}$。 你的目标是通过下列操作将所有列从上到下按升序排序: - 选择一个 $2 \times 2$ 的子网格,并将顶部的两个元素与底部的两个元素交换。具体地,你可以选择两个整数 $i$ 和 $j$($1 \leq i, j < 2n$),然后交换 $a_{i,j}$ 和 $a_{i+1,j}$,以及 $a_{i,j+1}$ 和 $a_{i+1,j+1}$。 你需要用不超过 $n \cdot \binom{2n}{2} + 9n$ 次操作将所有列排好序,或者判断无法完成任务。 注意,你不需要最小化操作次数。 $^{\text{∗}}$ 一个长度为 $m$ 的排列是指由 $1$ 到 $m$ 的 $m$ 个不同整数以任意顺序组成的数组。例如,$[2,3,1,5,4]$ 是排列,但 $[1,2,2]$ 不是($2$ 在数组中出现了两次),$[1,3,4]$ 也不是($m=3$ 但数组中有 $4$)。

输入格式

每组测试样例包含若干个测试用例。第一行包含测试用例数量 $t$($1 \leq t \leq 500$)。之后是每个测试用例的描述。 每个测试用例的第一行包含一个整数 $n$($1 \leq n \leq 80$)。 接下来的 $2n$ 行,每行包含 $2n$ 个整数 $a_{i,1},a_{i,2},\ldots,a_{i,2n}$($1 \leq a_{i,j} \leq 2n$),表示网格的第 $i$ 行。 保证网格中的每一列都是长度为 $2n$ 的排列。 保证所有测试用例的 $n^3$ 之和不超过 $80^3$。

输出格式

对于每个测试用例,如果无法用不超过 $n \cdot \binom{2n}{2} + 9n$ 次操作将所有列排序,则输出一行 $-1$。 否则,第一行输出一个整数 $k$($0 \leq k \leq n \cdot \binom{2n}{2} + 9n$),表示操作次数。 接下来的 $k$ 行,每行输出两个整数 $i_w$ 和 $j_w$($1 \leq i_w, j_w < 2n$),表示在第 $w$ 次操作中选择的位置。

说明/提示

在第一个测试用例中,你可以通过一次操作将各列排好序。 在第二个测试用例中,可以证明你无法将所有列排序。 下图为第三个测试用例的示意图: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF2268F/e9c069eb7535eecfa0985f922781b3c541f5ec73121dd2e373c7411417615029.png) 由 ChatGPT 5 翻译