从二进制矩阵的左上角开始查找包含全1的最短路径的长度

时间:2015-01-29 22:06:01

标签: algorithm matrix dynamic-programming graph-algorithm robot

给定一个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 )!)。 我正在寻找一种更有效的解决方案。

0 个答案:

没有答案