#L2755. 「CCO 2017」移动数组

「CCO 2017」移动数组

题目描述

译自 CCO 2017 Day2 「Shifty Grid」

给你一个 N×MN \times M 的二维数组。只能通过移动 (Shift) 操作来改动这个数组:

  • 将一行元素向左向右移动若干单位
  • 将一列元素向上向下移动若干单位

越界的元素会移动到该行或列的另一侧(循环移动)。 举个例子: 将第二列向下移动 11 个单位(或向上移动 33 个单位),二维数组将会变成这样:

一次移动 KK 个单位的左移操作等价于移动 MKM-K 个单位的右移操作(对列同理)。因此,我们规定只有下移右移操作。

数组中所有数各不相同,且 Numij[0,N×M1]\text{Num}_{ij} \in [0, N \times M - 1](第 iijj 列的数编号为 Numij\text{Num}_{ij})。

和谐数组的定义:第一行元素为 00M1M-1,第二行元素为 MM2M12M-1,以此类推。

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

输入格式

第一行为两个整数 N,MN, M

下面 NN 行每行包含 MM 个正整数,代表二维数组。

输出格式

第一行输出移动步数 KK

下面 KK 行输出操作:

  • 1 i r (1iN,0r<M)(1 \le i \le N, 0 \le r < M):第 ii 行右移 rr
  • 2 j d (1jM,0d<N)(1 \le j \le M, 0 \le d < N):第 jj 列下移 dd

样例 1

输入

2 4
4 2 3 0
1 5 6 7

输出

2
2 1 1
1 1 1

经过一下变换:

样例 2

输入

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

经以下变换:

数据范围与提示

  • N,MN, M 永远为偶数
  • 0K1050 \le K \le 10^5

数据规模

  • 对于 20%20\% 的数据,N×M8N \times M \le 8
  • 对于另外 40%40\% 的数据,K2K \le 2
  • 对于 100%100\% 的数据,2N,M1002 \le N, M \le 100