解题思路
我们要在一个 N×M 的矩阵中,为每一行选择“原样(0)”或“整行反转(1)”这两种状态,使得对所有列,同一列上的 N 个数字两两不同。
把每一行的选择记为布尔变量 xi∈{0,1}(0=不翻转,1=翻转)。对于任意两行 i,k 与任意一列 j,如果在某个组合下两行在列 j 的值相等,则该组合被禁止:
- Ai,j=Ak,j ⇒ 禁止 (xi=0, xk=0)
- Ai,j=Ak,M+1−j ⇒ 禁止 (0,1)
- Ai,M+1−j=Ak,j ⇒ 禁止 (1,0)
- Ai,M+1−j=Ak,M+1−j ⇒ 禁止 (1,1)
题目内容
有一个密码锁,密码锁是由一个 N×M 的矩阵构成,该密码锁只有在每一列上,每个数均不同的情况下,才能被打开,此外,还可以对矩阵的任意一行上的数字进行翻转操作(每行最多只能翻转一次);若此时仍然无法满打开密码锁的条件,则该密码锁将无法被打开。
现在给出密码锁上的密码矩阵,请你编写一个程序判断是否可以打开该密码锁。
输入描述