#CF1054E. Chips Puzzle

Chips Puzzle

markdown

E. 芯片谜题

每个测试的时间限制:11
每个测试的内存限制:256256 MB
输入:标准输入
输出:标准输出

Egor 想出了一个全新的芯片谜题,并邀请你来玩。
这个谜题是一个有 nnmm 列的表格,每个格子中可以放若干个黑色或白色的芯片,它们排成一列。因此,每个格子的状态可以用一个由字符 '0'(白色芯片)和 '1'(黑色芯片)组成的字符串来描述(可能为空),整个谜题的状态可以表示为一个表格,其中每个格子是一个由 01 组成的字符串。任务是从谜题的一个状态变换到另一个状态。

你可以使用以下操作:

  • 选择两个不同的格子 (x1,y1)(x_1, y_1)(x2,y2)(x_2, y_2):这两个格子必须在同一行或同一列,并且格子 (x1,y1)(x_1, y_1) 中的字符串必须非空;
  • 在一次操作中,你可以将格子 (x1,y1)(x_1, y_1) 中字符串的最后一个字符移动到格子 (x2,y2)(x_2, y_2) 中字符串的开头。

Egor 为你准备了表格的两个状态:初始状态和最终状态。保证两个状态中 01 的总数相同。你的目标是通过若干次操作从初始状态得到最终状态。当然,Egor 不希望操作次数过多。设 ss 为每个表格中字符的总数(两个表格相同),则你使用的操作次数不能超过 4s4 \cdot s

输入

第一行包含两个整数 nnmm1n,m3001 \le n, m \le 300)—— 表格的行数和列数。

接下来的 nn 行描述初始状态的表格,格式如下:每行包含 mm 个由 01 组成的非空字符串。在这些行的第 ii 行中,第 jj 个字符串是格子 (i,j)(i, j) 中的字符串。行从 11nn 编号,列从 11mm 编号。

接下来的 nn 行以相同的格式描述最终状态的表格。

设初始状态中所有字符串的总长度为 ss。保证 s100000s \le 100000。同时保证初始状态和最终状态中 01 的数量相同。

输出

第一行输出一个整数 qq —— 使用的操作次数。你需要找到一个满足 q4sq \le 4 \cdot s 的解。

接下来的 qq 行中,每行输出 44 个整数 x1,y1,x2,y2x_1, y_1, x_2, y_2。在第 tt 行中,输出第 tt 次操作的描述。这些整数应满足:1x1,x2n1 \le x_1, x_2 \le n1y1,y2m1 \le y_1, y_2 \le m(x1,y1)(x2,y2)(x_1, y_1) \neq (x_2, y_2),并且 x1=x2x_1 = x_2y1=y2y_1 = y_2。格子 (x1,y1)(x_1, y_1) 中的字符串必须非空。这一系列操作应将表格从初始状态变换为最终状态。

可以证明解一定存在。如果有多个解,输出任意一个即可。

示例

示例输入 1

2 2
00 10
01 11
10 01
10 01

示例输出 1

4
2 1 1 1
1 1 1 2
1 2 2 2
2 2 2 1

示例输入 2

2 3
0 0 0
011 1 0
0 0 1
011 0 0

示例输出 2

4
2 2 1 2
1 2 2 2
1 2 1 3
1 3 1 2

注释

考虑第一个示例。

  • 当前表格状态:
    00 10
    01 11
    
    第一次操作。格子 (2,1)(2,1) 中的字符串为 01。对格子 (2,1)(2,1)(1,1)(1,1) 执行操作,将 01 末尾的 1 移动到 00 的开头,得到字符串 100
  • 当前表格状态:
    100 10
    0   11
    
    第二次操作。格子 (1,1)(1,1) 中的字符串为 100。对格子 (1,1)(1,1)(1,2)(1,2) 执行操作,将 100 末尾的 0 移动到 10 的开头,得到字符串 010
  • 当前表格状态:
    10 010
    0  11
    
    第三次操作。格子 (1,2)(1,2) 中的字符串为 010。对格子 (1,2)(1,2)(2,2)(2,2) 执行操作,将 010 末尾的 0 移动到 11 的开头,得到字符串 011
  • 当前表格状态:
    10 01
    0  011
    
    第四次操作。格子 (2,2)(2,2) 中的字符串为 011。对格子 (2,2)(2,2)(2,1)(2,1) 执行操作,将 011 末尾的 1 移动到 0 的开头,得到字符串 10
  • 当前表格状态:
    10 01
    10 01
    
    显然,我们已到达最终状态。