Recursos-LCC

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

View on GitHub

LA2 | Torneio 3 (2021/2022) | Drone


"""
Num armazém rectangular pretende-se usar um drone para recolher caixas de
objectos. O drone consegue transportar uma caixa de cada vez e apenas
consegue deslocar-se para a frente/trás ou para a esquerda/direita.
O armazém é descrito por um mapa onde um * assinala a posição para onde
devem ser recolhidas as caixas (e onde se encontra o drone inicialmente)
e um digito uma posição onde se encontra uma caixa, sendo o digito o
número de objectos contido na caixa. Para se deslocar uma posição o drone
demora 0.5 segundos. Implemente uma função que dado o mapa e o tempo de
autonomia do drone calcule o número máximo de objectos que ele irá 
conseguir recolher.
"""


import collections


def bfsLAux(grid, start, finish):
    queue = collections.deque([[start]])
    seen = set([start])
    while queue:
        path = queue.popleft()
        x, y = path[-1]
        if x == finish[0] and y == finish[1]:
            return path
        for x2, y2 in ((x+1,y), (x-1,y), (x,y+1), (x,y-1)):
            if 0 <= x2 < len(grid[0]) and 0 <= y2 < len(grid) and grid[y2][x2] != '*' and (x2, y2) not in seen:
                queue.append(path + [(x2, y2)])
                seen.add((x2, y2))


def drone(mapa,tempo):
    
    aut = tempo*2
    pi = [0,0] # Posição inicial

    for i in range(0, len(mapa[0])): # Percorrer as linhas
        for j in range(0, len(mapa)): # Percorrer as colunas
            if (mapa[j][i] == '*'):
                pi[0], pi[1] = i, j
                break

    pi = tuple(pi)

    peso = []
    valor = []

    # Percorrer o mapa e encontrar a distancia de cada caixa e colocar em 'peso' e colocar o numero encontrado em 'valor'
    for i in range(0, len(mapa[0])): # Percorrer as linhas
        for j in range(0, len(mapa)): # Percorrer as colunas
            if (mapa[j][i] != ' ') and (mapa[j][i] != '*'):
                peso.append(2*(len(bfsLAux(mapa, pi, (i, j))) - 1))
                valor.append(int(mapa[j][i]))

    n = len(peso)

    return aux(aut, peso, valor, n)


def aux(W, wt, val, n):
 
    if n == 0 or W == 0:
        return 0
 
    if (wt[n-1] > W):
        return aux(W, wt, val, n-1)
 
    else:
        return max(val[n-1] + aux(W-wt[n-1], wt, val, n-1), aux(W, wt, val, n-1))


Testes

# 1
mapa = ["*  5 8",
        "24    "]
tempo = 8
> Resultado = 14

# 2
mapa = [" 1 ",
        "2*2",
        " 1 "]
tempo = 2
> Resultado = 4

retroceder