#CF3705. 矩阵和位移
矩阵和位移
题目描述
给定一个大小为 的二进制矩阵 。行从上到下从 到 编号,列从左到右从 到 编号。位于第 行和第 列交点处的元素称为 。考虑一个由 个操作组成的集合:
-
将所有行循环向上移动。行索引为 的行将被写入行 的位置 ,行索引为 的行将被写入行 的位置。
-
将所有行循环向下移动。行索引为 的行将被写入行 的位置 ,行索引为 的行将被写入行 的位置。
-
将所有列循环向左移动。列索引为 的列将被写入列 的位置 ,列索引为 的列将被写入列 的位置。
-
将所有列循环向右移动。列索引为 的列将被写入列 的位置 ,列索引为 的列将被写入列 的位置。
左侧显示的是在进行第三种操作之前的 矩阵,在右侧则是经过操作后的结果。
你可以在矩阵上可以执行任意(可能为零)数量的操作;操作可以以任意顺序执行。
之后,您可以执行任意(可能为零)数量的新异或操作:
- 选择任意元素 ,并将其赋予新值 。换句话说,将 的值写入元素 。
每个异或操作的代价为 1
。请注意, 个移位操作是免费的。这 个操作只能在执行异或操作之前进行。
输出您需要支付的最少费用,以使矩阵 成为单位矩阵。单位矩阵是指主对角线上元素为 1
,其余元素为 0
的矩阵(即,如果 ,则 ,否则 )。
输入格式
输入的第一行包含一个整数 ——测试用例的数量。
接下来是每个测试用例的描述。在每个测试用例之前,输入中都有一个空行。
每个测试用例的第一行包含一个数字 。
接下来的 行,每行包含恰好 个字符,仅由零和一组成。这些行描述了矩阵元素的值。
保证在所有测试用例中, 的总和不超过 。
输出格式
对于每个测试用例,输出最小的操作代价,使得矩阵A变成单位矩阵。换句话说,输出在应用循环移位操作后,将A矩阵变成单位矩阵所需的最小异或操作次数。
测试样例
4
3
010
011
100
5
00010
00001
10000
01000
00100
2
10
10
4
1111
1011
1111
1111
1
0
2
11
样例说明
在第一个测试用例中,你可以按照以下方式操作:首先,将所有行循环向下移动,然后矩阵的主对角线将只包含 1
。然后需要对不在主对角线上的唯一的 1
应用异或操作。
在第二个测试用例中,你可以通过将操作 (将行循环向上移动两次)应用到矩阵中来制作一个单位矩阵。