Approximation Algorithm for non-intersecting paths in a grid

后端 未结 3 803
旧巷少年郎
旧巷少年郎 2021-01-14 08:25

I recently came across this question and thought I could share it here, since I wasn\'t able to get it.

We are given a 5*5 grid numbered from 1-25, and a set of 5 pa

3条回答
  •  遥遥无期
    2021-01-14 09:21

    Here's a program written in Python that walks all potential paths. It uses recursion and backtracking to find the paths, and it marks a grid to see which locations are already being used.

    One key optimization is that it marks the start and end points on the grid (10 of the 25 points).

    Another optimization is that it generates all moves from each point before starting the "walk" across the grid. For example, from point 1 the moves are to points 2 & 6; from point 7, the moves are to points 2, 6, 8 & 12.

    points = [(1,22), (4,17), (5,18), (9,13), (20,23)]
    paths = []
    
    # find all moves from each position 0-25
    moves = [None]    # set position 0 with None
    for i in range(1,26):
        m = []
        if i % 5 != 0:    # move right
            m.append(i+1)
        if i % 5 != 1:    # move left
            m.append(i-1)
        if i > 5:         # move up
            m.append(i-5)
        if i < 21:        # move down
            m.append(i+5)
        moves.append(m)
    
    # Recursive function to walk path 'p' from 'start' to 'end'
    def walk(p, start, end):
        for m in moves[start]:    # try all moves from this point
            paths[p].append(m)    # keep track of our path
            if m == end:          # reached the end point for this path?
                if p+1 == len(points):   # no more paths?
                    if None not in grid[1:]:    # full coverage?
                        print
                        for i,path in enumerate(paths):
                            print "%d." % (i+1), '-'.join(map(str, path))
                else:
                    _start, _end = points[p+1]  # now try to walk the next path
                    walk(p+1, _start, _end)
    
            elif grid[m] is None:    # can we walk onto the next grid spot?
                grid[m] = p          # mark this spot as taken
                walk(p, m, end)
                grid[m] = None       # unmark this spot
            paths[p].pop()       # backtrack on this path
    
    grid = [None for i in range(26)]   # initialize the grid as empty points
    for p in range(len(points)):
        start, end = points[p]
        paths.append([start])          # initialize path with its starting point
        grid[start] = grid[end] = p    # optimization: pre-set the known points
    
    start, end = points[0]
    walk(0, start, end)
    

提交回复
热议问题