给定一个0和1的矩阵,奶牛想要从角落(0,0)开始收集矩阵中的所有1。它可以向上,向下,向左,向右移动(除非在矩阵的边缘,在这种情况下它不能使移动脱落)。牛可以做的最短路径的长度是多少? 这是Python中的强力解决方案:
import itertools
import sys
matrix = [[1, 0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0, 1]]
list = []
for x, i in enumerate(matrix):
for y, j in enumerate(i):
if j==1:
list.append([x,y])
shortest = sys.maxint
for path in itertools.permutations(list):
prev = [0,0]
length = 0
for element in path:
length += abs(element[0]-prev[0]) + abs(element[1]-prev[1])
prev = element
if shortest > length:
shortest = length
print shortest
此解决方案采用O( a !)时间,其中<em> a 是1的数量。因此,假设矩阵的维数是 nk ,我们可以给出的上限是O(( nk )!)。 我正在寻找一种更有效的解决方案。