Recursos-LCC

Um arquivo de todo material que consegui reunir, pertinente ao curso de LCC da UM.

View on GitHub

LA2 | Treino 2 | Labirinto


'''
Implemente uma função que calcula um dos caminhos mais curtos para atravessar
um labirinto. O mapa do labirinto é quadrado e representado por uma lista 
de strings, onde um ' ' representa um espaço vazio e um '#' um obstáculo.
O ponto de entrada é o canto superior esquerdo e o ponto de saída o canto
inferior direito. A função deve devolver uma string com as instruções para
atravesar o labirinto. As instruções podem ser 'N','S','E','O'.
'''

def build(mapa):
    adj = {}
    length = len(mapa)
    width = len(mapa[0])
    for y in range(length):
        for x in range(width):
            if mapa[y][x] == '#':
                continue
            elif (x, y) not in adj:
                adj[(x, y)] = set()
            for i in [-1, 0, 1]:
                for j in [-1, 0, 1]:
                    if abs(i) + abs(j) == 2:
                        continue
                    if not 0 <= x+i < width:
                        continue
                    if not 0 <= y+j < length:
                        continue
                    if mapa[y+j][x+i] == '#':
                        continue
                    if (x+i, y+j) not in adj:
                        adj[(x+i, y+j)] = set()
                    
                    adj[(x, y)].add((x+i, y+j))
                    adj[(x+i, y+j)].add((x, y))
    return adj


def bfs(adj,o):
    pai = {}
    vis = {o}
    queue = [o]
    while queue:
        v = queue.pop(0)
        for d in adj[v]:
            if d not in vis:
                vis.add(d)
                pai[d] = v
                queue.append(d)
    return pai


def caminho(mapa):
    origem = (0,0)
    destino = (len(mapa)-1 , len(mapa[0])-1)
    
    adj = build(mapa)
    caminho = bfs(adj,destino)
    
    res = ""
    
    while origem in caminho:
        dx = caminho[origem][0] - origem[0]
        dy = caminho[origem][1] - origem[1]
        
        if dx==0 and dy==-1:
            res += 'N'
        elif dx==0 and dy==1:
            res += 'S'
        elif dx==1 and dy==0:
            res += 'E'
        elif dx==-1 and dy==0:
            res += 'O'
        
        origem = caminho[origem]
    
    return res


Testes

# 1
mapa = ["  ########",
        "# # #    #",
        "# # #### #",
        "# #      #",
        "# # # ####",
        "# # #    #",
        "#   # #  #",
        "##### ####",
        "#        #",
        "########  "]
> Resultado = "ESSSSSSEENNNEESSSSSEEESE"

# 2
mapa = ['   ',
        ' # ',
        '   ']
> Resultado = ["EESS","SSEE"]

retroceder