95. 费解的开关
95. 费解的开关
题目描述
在一个 \(5 \times 5\) 的 \(01\) 矩阵中,点击任意有、一个位置,该位置以及它上、下、左、右四个相邻的位置中的在、数字都会变化(\(0\) 变成 \(1\),\(1\) 变成 \(0\)),问:做少需要多少次点击可以把一个给定的 \(01\) 矩阵变成全 \(0\) 矩阵?(如果超过 \(6\) 次输出 -1)。
样例
输入:
3
00111
01011
10001
11010
11100
11101
11101
11110
11111
11111
01111
11111
11111
11111
11111
输出:
3
2
-1
算法
(递推)
在上述规则的 \(01\) 矩阵的点击游戏中,很容易发现三个性质。
- 每个位置至多只会被点击一次。
- 若固定第一行(不能再改变第一行),则满足题意的点击方案至多只有 \(1\) 种。其原因是:当第 \(i\) 行某一位为 \(1\) 时,若前 \(i\) 行已被固定,只能点击第 \(i + 1\) 行该位置上的数字才能使第 \(i\) 的这一位变成 \(0\)。从上到下按行使用归纳法可得上述结论。
- 点击的先后顺序不影响最终结果。
于是,我们不妨先考虑第一行如何点击。在枚举第一行的点击方法(\(2^5 = 32\) 种)后,就可以认为第一行“固定不动”,再考虑第 \(2 - 5\) 如何点击。而按照上述性质 \(2\),此时第 \(2 - 5\) 行的点击方案是确定的——从第一行开始递推,当第 \(i\) 某一位为 \(1\) 时,点击第 \(i + 1\) 行该位置上的数字。若到达第 \(n\) 行时不全为 \(0\),说明这种点击方式不合法。在所有合法的点击方式中取点击次数最少的就是答案。对第一行的 \(32\) 次枚举涵盖了该问题的整个状态空间,因此该做法是正确的。
对于第一行点击方法的枚举,可以采用位运算的方式,枚举 \(0 - 31\) 这 \(32\) 个 \(5\) 位二进制数,若二进制数的第 \(k(0 \le k < 5)\) 位为 \(1\),就点击 \(01\) 矩阵第 \(1\) 行第 \(k + 1\) 列的数字。

浙公网安备 33010602011771号