Grafy w Pythonie – Labirynt

# Tak można zdefiniować graf (pierwsza linia jest nieco przesunieta..)
maze_txt =  '''█████ ████
█     █  █
█ ██████ █
█        █
████ █████'''
start = 44
end = 5
print(maze_txt)

# a to troche większy labirynt

maze_txt =  '''██████████████ █████
█              █   █
█████ ███ ████████ █
█     █ █          █
█ █████ ██████████ █
█        █    █    █
████████ ██ █ █ ██ █
█        █  █ █  █ █
█ ██████ ██ █ ██ █ █
█           █    █ █
█████████ ██████████'''
start = 209
end = 14
print(maze_txt)



# policz wysokosc i szerokosc grafu - 
maze_lines = maze_txt.split("\n")
h=len(maze_lines)
w=len(maze_lines[0])
print(h, w, h*w)

# zbuduj jeden dlugi tekst, ktory zawiera w sobie tylko znaki grafu
# po tym tekscie bedzie mozna przemieszczac sie korzystajac z indeksow
# usuwam entery zeby text odpowiadal numeracji wezlow
maze_txt = maze_txt.replace('\n','')

# proces budowy struktury grafu
graph = [ [] for i in range(len(maze_txt))]

# tu odbywa sie przeksztalcenie graficznej reprezentacji labiryntu
# do postaci grafu
#     wierzcholki to pola labiryntu - droga lub sciana
#     krawedz, to mozliwosc przejscia do innego pola

for i in range(len(maze_txt)):
    # Jesli przez to pole prowadzi droga
    if maze_txt[i] == ' ':
        # dla kazdego wezla musze ustalic co jest po lewej/prawej/wyzej/w dol    
        on_left  = None if i % w == 0     else i-1
        on_right = None if (i+1) % w == 0 else i+1
        on_up    = None if i < w          else i-w
        on_down  = None if i + w > h * w  else i+w
        # sprawdzic czy jest to droga i jesli tak, to dodac info do definicji grafu
        if on_left and maze_txt[on_left] == ' ':
            graph[i].append(on_left)
        if on_right and maze_txt[on_right] == ' ':
            graph[i].append(on_right)
        if on_up and maze_txt[on_up] == ' ':
            graph[i].append(on_up)
        if on_down and maze_txt[on_down] == ' ':
            graph[i].append(on_down)



# funkcja do wyszukiwania najkrótszej drogi

def is_path_between(V, source, dest):

    list_to_check = [[source]]
    list_visited = []

    while list_to_check:

        current_path = list_to_check.pop(0)
        current_node = current_path[-1]
        if current_node == dest:
            return current_path
        else:
            if current_node not in list_visited:
                list_visited.append(current_node)
                for n in V[current_node]:
                    new_path = current_path.copy()
                    new_path.append(n)
                    list_to_check.append(new_path)
    
    return []



# find shortest path between start and end
path = is_path_between(graph, start, end)

# narysuj graf, oznaczając znalezioną ścieżkę znakiem *
for i in range(h):
    line = ''
    for j in range(w):
        if (i*w+j) in path:
            line+='*'
        else:
            line+=maze_txt[i*w+j]
    print(line)