Cut off Trees for Golf Event

use A* Algorithm

Maintain two lists, search list1 first and than search list2

node in list1 is 2 steps less than node in list2

class Solution(object):
    def cutOffTree(self, forest):
        """
        :type forest: List[List[int]]
        :rtype: int
        """
        m = len(forest)
        n = len(forest[0])
        forest.append([0] * n)
        for row in forest:
            row.append(0)

        self.order = collections.OrderedDict()
        res = 0
        self.order[0] = (0,0)

        for i in range(m):
            for j in range(n):
                if forest[i][j] > 1:
                    self.order[forest[i][j]] = (i, j)

        def find_small_path(p1, p2):
            theMin = abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
            stack1, stack2 = [p1], []
            visited = set()

            while stack1 or stack2:
                if not stack1:
                    stack1, stack2 = stack2, stack1
                    theMin += 2

                p = stack1.pop()
                if p == p2:
                    return theMin

                if p in visited:
                    continue
                visited.add(p)

                i = p[0]
                j = p[1]

                tmp1, tmp2 = [], []

                if i < p2[0]:
                    tmp1.append((i+1, j))
                    tmp2.append((i-1, j))
                elif i > p2[0]:
                    tmp1.append((i-1, j))
                    tmp2.append((i+1, j))
                else:
                    tmp2.append((i-1, j))
                    tmp2.append((i+1, j))

                if j < p2[1]:
                    tmp1.append((i, j+1))
                    tmp2.append((i, j-1))
                elif j > p2[1]:
                    tmp1.append((i, j-1))
                    tmp2.append((i, j+1))
                else:
                    tmp2.append((i, j-1))
                    tmp2.append((i, j+1))

                for v in tmp1:
                    if forest[v[0]][v[1]] != 0:
                        stack1.append(v)

                for v in tmp2:
                    if forest[v[0]][v[1]] != 0:
                        stack2.append(v)

            return -1



        self.order = sorted(self.order.items())

        for i in range(len(self.order)-1):
            path = find_small_path(self.order[i][1], self.order[i+1][1])
            if path == -1:
                return -1
            res += path

        return res

results matching ""

    No results matching ""