Algorithm 使用最小行-列切换数将NxN二进制矩阵转换为零矩阵

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时) 有什么更好的算法可以解决这个随矩阵大小变

与此问题类似:,但不是有两个操作(切换行或切换列),我们只有一个操作,即拾取坐标(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时)

有什么更好的算法可以解决这个随矩阵大小变化的问题

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