Algorithm 使用最小行-列切换数将NxN二进制矩阵转换为零矩阵
与此问题类似:,但不是有两个操作(切换行或切换列),我们只有一个操作,即拾取坐标(i,j),并切换包含(i,j)的行和列 例如,切换矩阵的(0,0)Algorithm 使用最小行-列切换数将NxN二进制矩阵转换为零矩阵,algorithm,matrix,Algorithm,Matrix,与此问题类似:,但不是有两个操作(切换行或切换列),我们只有一个操作,即拾取坐标(i,j),并切换包含(i,j)的行和列 例如,切换矩阵的(0,0) |1 1 1| |1 1 1| |1 1 1| 将屈服 |0 0 0| |0 1 1| |0 1 1| 我尝试了一种递归方法,尝试切换之前未切换的每个元素(I,j),并将切换矩阵递归地传递给函数。我找到了最小的切换次数,并返回结果+1。但是,该解决方案不能很好地与矩阵的大小成比例(尤其是当大小>10时) 有什么更好的算法可以解决这个随矩阵大小变
|1 1 1|
|1 1 1|
|1 1 1|
将屈服
|0 0 0|
|0 1 1|
|0 1 1|
我尝试了一种递归方法,尝试切换之前未切换的每个元素(I,j),并将切换矩阵递归地传递给函数。我找到了最小的切换次数,并返回结果+1。但是,该解决方案不能很好地与矩阵的大小成比例(尤其是当大小>10时)
有什么更好的算法可以解决这个随矩阵大小变化的问题
def toggle_matrix(matrix, row, col):
new_matrix = [list(r) for r in matrix]
for i in xrange(len(matrix)):
new_matrix[i][col] ^= 1
new_matrix[row][i] ^= 1
new_matrix[row][col] ^= 1
return tuple(tuple(r) for r in new_matrix)
def answer_recur(matrix, touched, cache):
if all(c == 0 for r in matrix for c in r):
return 0
if matrix in cache:
return cache[matrix]
min_touches = float('inf')
for row in xrange(len(matrix)):
for col in xrange(len(matrix)):
elem = (row, col)
if elem in touched:
continue
min_touches = min(min_touches, answer_recur(toggle_matrix(matrix, row, col), touched | set([elem]), cache))
cache[matrix] = min_touches + 1
return min_touches + 1
def answer(matrix):
matrix = tuple(tuple(r) for r in matrix)
result = answer_recur(matrix, set(), {})
if result == float('inf'):
return -1
return result