[CCO2017] 移动数组
题目描述
给你一个二维数组。我们只能通过 **移动(Shift)** 操作来改动这个数组。一次移动操作可以将一行元素向左(或向右)移几个单位;或将一列元素向上(或向下)移几个单位。如果被移动的元素越界,则将越界元素移动到该行或列的另一侧。
举个例子:
```
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
```
将第二列向下移动 $1$ 个单位(或向上移动 $3$ 个单位),二维数组将会变成这样:
```
0 13 2 3
4 1 6 7
8 5 10 11
12 9 14 15
```
一次移动 $k$ 个单位的 **左移** 操作等价于移动 $n-k$ 个单位的 **右移** 操作。在列上的变换同样。
因此,我们规定只有 **下移** 和 **右移** 操作。
在一个 $n \times m$ 的二维数组中,所有的数各不相同,且 $Num_{ij} \in [0,n-1]$(规定第 $i$ 行 $j$ 列的数编号为 $Num_{ij}$)。
在第一个例子中,我们给你的二维数组非常 **和谐**,我们叫它 **和谐数组 (Solved)**。一个二维数组当且仅当第一行的元素按照升序编号分别为从 $0$ 到 $m-1$,第二行元素为从 $m$ 到 $2m-1$,以此类推时,我们称它为 **和谐数组**。
你的任务是找到一系列的操作,使得二维数组变成 **和谐数组**。
输入输出格式
输入格式
第一行为两个整数 $n,m$;
下面的 $n$ 行将会包含 $m$ 个代表二维数组的正整数。
输出格式
第一行输出移动的步数 $k$($1\leq k\leq 10 ^ 5$)。
下面的 $k$ 行输出:`1 i r` ($1 \le i \le n$,$0 \le r < m$),代表使第 $i$ 行 **右移** $r$ 格,或 `2 j d` ($1 \le j \le m$,$0 \le d <n$),代表使第 $j$ 列 **下移** $d$ 格。
如果数组本身就是和谐数组,输出 $0$。
输入输出样例
输入样例 #1
2 4
4 2 3 0
1 5 6 7
输出样例 #1
2
2 1 1
1 1 1
输入样例 #2
4 2
2 3
5 0
4 1
6 7
输出样例 #2
7
1 1 1
2 1 1
1 2 1
1 3 1
2 1 2
1 1 1
2 1 1
说明
#### 样例解释
对于样例 $1$:经过如下变换
```
4 2 3 0 -> 1 2 3 0 -> 0 1 2 3
1 5 6 7 4 5 6 7 4 5 6 7
```
对于样例 $2$:经过如下变换
```
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
```
#### 数据范围及约定
**本题采用多测试点捆绑测试,共有 $3$ 个子任务。**
- Subtask 1(20 points):$2 \le n \times m \le 8$;
- Subtask 2(40 points):$1 \le k \le 2$;
- Subtask 3(40 points):无特殊限制。
对于全部的测试点,保证 $2 \le n,m \le 100$,$1 \le k \le 10^5$,保证 $n,m$ 为偶数。
来源:[CCO 2017](https://cemc.math.uwaterloo.ca/contests/computing/2017/) Day2「[Shifty Grid](https://cemc.math.uwaterloo.ca/contests/computing/2017/stage%202/day2.pdf)」。
说明:翻译来自 [LOJ](https://loj.ac/problem/2755)。