Cho ma trận M và ma trận đích T cùng kích thước. Phép toán: lật một cột (0->1, 1->0). Có thể sắp xếp lại hàng miễn phí. Tìm số phép lật tối thiểu để biến M thành T, trả về -1 nếu không thể.
Ví dụ
Đầu vào: ma trận M, T (xem code).
Đầu ra: 1.
Thuật toán
- Chuyển mỗi hàng thành số nguyên nhị phân (bit thấp là cột cuối).
- Với mỗi hàng của M làm hàng tham chiếu, tính
my_xor = row_M ^ row_T[0]. - Kiểm tra xem có thể ghép các hàng còn lại của M với các hàng của T bằng cách XOR với
my_xor(sử dụng Counter). - Nếu có, cập nhật kết quả = min(kết quả, số bit 1 của
my_xor). - Trả về kết quả hoặc -1.
Mã nguồn Python
class Solution:
def solve(self, matrix, target):
nums1 = []
nums2 = []
for row in matrix:
ths = 0
while row:
ths = (ths << 1) + row.pop()
nums1.append(ths)
for row in target:
ths = 0
while row:
ths = (ths << 1) + row.pop()
nums2.append(ths)
ret = float('inf')
from collections import Counter
for num in nums1:
cts = Counter(nums1)
cts[num] -= 1
my_xor = num ^ nums2[0]
for i in range(1, len(nums2)):
needed = my_xor ^ nums2[i]
if not cts[needed]:
break
cts[needed] -= 1
else:
ret = min(ret, bin(my_xor).count('1'))
return ret if ret != float('inf') else -1
ob = Solution()
M = [[0,0],[1,0],[1,1]]
T = [[0,1],[1,0],[1,1]]
print(ob.solve(M, T))
Đầu vào / Đầu ra
Input: M = [[0,0],[1,0],[1,1]], T = [[0,1],[1,0],[1,1]]
Output: 1