#P6347. [CCO2017] 移动数组

[CCO2017] 移动数组

题目描述

给你一个二维数组。我们只能通过 移动(Shift) 操作来改动这个数组。一次移动操作可以将一行元素向左(或向右)移几个单位;或将一列元素向上(或向下)移几个单位。如果被移动的元素越界,则将越界元素移动到该行或列的另一侧。

举个例子:

0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

将第二列向下移动 11 个单位(或向上移动 33 个单位),二维数组将会变成这样:

0 13 2 3
4 1 6 7
8 5 10 11
12 9 14 15

一次移动 kk 个单位的 左移 操作等价于移动 nkn-k 个单位的 右移 操作。在列上的变换同样。

因此,我们规定只有 下移右移 操作。

在一个 n×mn \times m 的二维数组中,所有的数各不相同,且 Numij[0,n1]Num_{ij} \in [0,n-1](规定第 iijj 列的数编号为 NumijNum_{ij})。

在第一个例子中,我们给你的二维数组非常 和谐,我们叫它 和谐数组 (Solved)。一个二维数组当且仅当第一行的元素按照升序编号分别为从 00m1m-1,第二行元素为从 mm2m12m-1,以此类推时,我们称它为 和谐数组

你的任务是找到一系列的操作,使得二维数组变成 和谐数组

输入格式

第一行为两个整数 n,mn,m

下面的 nn 行将会包含 mm 个代表二维数组的正整数。

输出格式

第一行输出移动的步数 kk1k1051\leq k\leq 10 ^ 5)。

下面的 kk 行输出:1 i r1in1 \le i \le n0r<m0 \le r < m),代表使第 ii右移 rr 格,或 2 j d1jm1 \le j \le m0d<n0 \le d <n),代表使第 jj下移 dd 格。

如果数组本身就是和谐数组,输出 00

2 4
4 2 3 0
1 5 6 7
2
2 1 1
1 1 1
4 2
2 3
5 0
4 1
6 7
7
1 1 1
2 1 1
1 2 1
1 3 1
2 1 2
1 1 1
2 1 1

提示

样例解释

对于样例 11:经过如下变换

4 2 3 0  -> 1 2 3 0 -> 0 1 2 3
1 5 6 7     4 5 6 7    4 5 6 7

对于样例 22:经过如下变换

2 3      3 2      6 2      6 2      6 2      1 2      2 1      0 1
5 0   -> 5 0   -> 3 0   -> 0 3   -> 0 3   -> 4 3   -> 4 3   -> 2 3
4 1      4 1      5 1      5 1      1 5      6 5      6 5      4 5
6 7      6 7      4 7      4 7      4 7      0 7      0 7      6 7

数据范围及约定

本题采用多测试点捆绑测试,共有 33 个子任务。

  • Subtask 1(20 points):2n×m82 \le n \times m \le 8
  • Subtask 2(40 points):1k21 \le k \le 2
  • Subtask 3(40 points):无特殊限制。

对于全部的测试点,保证 2n,m1002 \le n,m \le 1001k1051 \le k \le 10^5,保证 n,mn,m 为偶数。

来源:CCO 2017 Day2「Shifty Grid」。

说明:翻译来自 LOJ