我在Python 3.4中从头开始编写匈牙利语算法,并且遇到了关于覆盖零的最佳行的问题。
我从其维基百科页面中获取了算法的定义,这是用于查找覆盖所有零的最小行的代码:
def minZeroLines(matrix):
markMatrix = [] #first for marked rows, second for marked columns
for row in range(len(matrix)):
markMatrix.append([])
for col in range(len(matrix)):
markMatrix[row].append("")
for row in range(len(matrix)):
for col in range(len(matrix)):
if matrix[row][col] == 0 and ("*" not in [i[col] for i in markMatrix] and "*" not in markMatrix[row]):
markMatrix[row][col] = "*"
print(markMatrix)
rowColMark = [[],[]] #1st rows, 2nd cols
for i in range(len(matrix)):
rowColMark[0].append("")
rowColMark[1].append("")
for row in range(len(markMatrix)):
if "*" not in markMatrix[row]:
rowColMark[0][row] = "x"
print(rowColMark)
for row in range(len(markMatrix)):
if rowColMark[0][row] == "x":
for col in range(len(matrix)):
if matrix[row][col] == 0:
rowColMark[1][col] = "x"
for row2 in range(len(markMatrix)):
if matrix[row2][col] == 0 and markMatrix[row2][col] == "*":
rowColMark[0][row2] = "x"
print(rowColMark)
lineList = []
for col in range(len(rowColMark[1])):
if rowColMark[1][col] == "x":
lineList.append("c"+str(col))
for row in range(len(rowColMark[0])):
if rowColMark[0][row] != "x":
lineList.append("r"+str(row))
print(rowColMark)
print(lineList)
return lineList
问题在于,当我通过它运行下面的矩阵时,在初始分配零期间,作为寻找覆盖它们的最小线的第一步,选择矩阵[1] [1]处的零。这导致函数稍后标记所有行,这意味着它们不会被排列,即使行矩阵[1]应该是明确的。
matrix = [[0, 0, 16, 16, 16, 16, 16],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 16, 16, 16, 16, 16],
[0, 0, 16, 16, 16, 16, 16],
[0, 0, 16, 16, 16, 16, 16],
[0, 0, 16, 16, 16, 16, 16],
[0, 0, 16, 16, 16, 16, 16]]
这是导致问题的部分:
for row in range(len(matrix)):
for col in range(len(matrix)):
if matrix[row][col] == 0 and ("*" not in [i[col] for i in markMatrix] and "*" not in markMatrix[row]):
markMatrix[row][col] = "*"
我认为必须有一些我错过的条件会阻止分配零,但这在我看过的描述和其他地方都没有详细说明。谁知道我做错了什么?