g2.change_current_pos(r,c,ch)
    vis = g2.all_visible_keys()
    vis_keys = ','.join(sorted([k for d,k,ch in vis]))
    p1 = g2.pos_of['1']
    p2 = g2.pos_of['2']
    p3 = g2.pos_of['3']
    p4 = g2.pos_of['4']
    if (k, vis_keys, p1, p2, p3, p4) in cache:
        return d + cache[(k, vis_keys, p1, p2, p3, p4)]

    if len(vis) == 0:
        result = 0
    else:
        result = min([min_dist(g2, k2, d2, ch2) for d2,k2,ch2 in vis])
        
    cache[(k, vis_keys, p1, p2, p3, p4)] = result
    return d + result
    
filename = argv[1]
grid = Grid()
with open(filename) as f:
    for line in f:
        line = line.rstrip()
        grid.add_row(line)

print(grid)

visible = grid.all_visible_keys()
print(visible)
print('Part 2:', min([min_dist(grid, k, d, ch) for d,k,ch in visible]))