Recursos-LCC

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

View on GitHub

LA2 | Torneio 5 (2020/2021) | Distância


"""
Neste problema pretende-se calcular a distância mais curta entre cidades
num mapa. O mapa consiste numa matriz (definida como uma lista de listas) onde
uma letra representa uma cidade e um número uma estrada de largura igual a esse
número. A função a implementar, para além do mapa, da cidade origem, e da
cidade destino, recebe também a largura do veículo em que se pretende
fazer a viagem. Assuma que as cidades dadas existem no mapa, que o mapa está
bem formado, que os carros apenas se deslocam na horizontal e na vertical, e
que numa cidade consegue circular um carro de qualquer largura.

A função deve devolver -1 se não existir caminho entre as duas cidades.
Deve devolver -2 se existir caminho, mas não usando um carro da largura dada.
Noutro caso deve devolver o tamanho do caminho mais curto entre as duas cidades.
"""


def existeCaminho(ori, des, largura, mapa, N, M):
    queue = [(ori[0], ori[1], 0)]
    vis = [ori]
    for x,y,t in queue:
        if (x,y) == des:
            return t
        dx = [-1, 1, 0, 0]
        dy = [ 0, 0,-1, 1]
        for d in range(4):
            newX = x+dx[d]
            newY = y+dy[d]
            if 0 <= newX < N and 0 <= newY < M:
                if (newX, newY) in vis:
                    continue
                if mapa[newY][newX].isalpha():
                    vis.append((newX, newY))
                    queue.append((newX, newY, t+1))
                if mapa[newY][newX].isdigit() and int(mapa[newY][newX]) >= largura:
                    vis.append((newX, newY))
                    queue.append((newX, newY, t+1))
    return -1

def encontraCidades(mapa, N, M):
    lista = []
    for y in range(M):
        for x in range(N):
            if mapa[y][x].isalpha():
                lista.append((x,y))
    return lista

def findCidade(cid, mapa, cidades):
    for x,y in cidades:
        if mapa[y][x] == cid:
            return (x,y)

# Isto está só estúpido, estes loops desnecessários meu deus
def distancia(mapa,tamanho,origem,destino):
    print(mapa)
    existe = -1
    M = len(mapa)
    N = len(mapa[0])
    cidades = encontraCidades(mapa, N, M)
    
    o = findCidade(origem, mapa, cidades)
    d = findCidade(destino, mapa, cidades)
    
    tamanhos = [{} for x in range(tamanho+1)]
    for t in range(tamanho+1):
        tam = tamanhos[t]
        for x in cidades:
            for y in cidades:
                if x == y:
                    continue
                if x not in tam:
                    tam[x] = {}
                if y not in tam:
                    tam[y] = {}
                if x not in tam[y]:
                    tam[y][x] = existeCaminho(x,y,t, mapa, N, M)
                    tam[x][y] = tam[y][x]
                    if x in [o,d] and y in [o,d] and tam[y][x] != -1:
                        existe = -2
                        if tamanho == t:
                            return tam[y][x]
    return existe


Testes

# 1
mapa = ["   C43",
        "   2 3",
        "A33B45",
        "5  5  ",
        "4255  "]
tamanho = 3
origem = 'A'
destino = 'C'
> Resultado = 9

# 2
mapa = ["   C43",
        "   2 3",
        "A33B45",
        "5  5  ",
        "4255  "]
tamanho = 9
origem = 'A'
destino = 'C'
> Resultado = -2

retroceder