Estacionamento

1. Revisão de Conceitos

Representação da Matriz (Strings vs. Listas)

Em Python, strings são imutáveis. Isso significa que se você armazenar as linhas do estacionamento como strings ("....."), não conseguirá fazer linha[0] = 'C'. Você receberá um erro. Em contraste, uma lista de listas de caracteres pode ser modificada. Assim, você pode acessar e alterar posições específicas livremente: matriz[linha][coluna] = 'C'.

Dicionários (O Segredo para a Saída de Veículos)

A matriz guarda apenas os caracteres C, M, . e #. Ela não guarda as placas. Quando o comando S placa (Saída) for chamado, como você saberá quais posições na matriz aquele veículo específico ocupava para transformá-las novamente em .? Será que estudamos alguma forma de relacionar str (placa) com alguma informação (local estacionado)?

Os testes 1 e 8 não possuem nenhuma saída de veículos. Portanto, antes de começar a implementar essa parte, garanta que o seu código está passando nesses testes. Caso contrário, confira as demais partes do seu código antes de continuar!


2. Dicas de Estruturação (Por onde começar?)

Problemas de matrizes podem gerar códigos muito longos e confusos. Divida o problema mentalmente (e no seu código) nas seguintes etapas:

Passo A: Preparando o Terreno Leia as dimensões l e c. Depois, leia o estado inicial do estacionamento e converta no formato que achar apropriado. Crie também qualquer variável que achar que precisa.

Passo B: A Lógica de “Encaixe” Ao invés de escrever um if gigante para cada tipo de veículo, pense em como você verifica se um retângulo de tamanho “altura” x “largura” cabe a partir de uma posição (i, j). Para que o encaixe seja bem-sucedido, duas coisas devem ser verdadeiras:

  1. O retângulo inteiro não pode ultrapassar os limites da matriz (linhas l e colunas c).
  2. Todas as posições dentro desse retângulo na matriz devem ser exatamente ..

Será que uma função que responde isso seria uma boa ideia?

Passo C: A Busca pela Vaga Perfeita (Entrada ‘E’) Para estacionar um veículo, você precisará percorrer a matriz. Para **cada espaço (i, j)**, as regras do drone são estritas:

  1. Tente encaixar o veículo na horizontal (Carro: 2x3, Moto: 1x3).
  2. Se não couber na horizontal, tente encaixar na mesma posição (i, j) na vertical (Carro: 3x2, Moto: 3x1).
  3. Se couber de alguma das formas, marque a matriz com C ou M, salve as coordenadas no seu dicionário usando a placa, some um aos clientes atendidos e pare a busca por essa vaga.
  4. Se o loop terminar e nenhuma vaga for encontrada, o cliente não foi atendido.

Passo D: Retirando o Veículo (Saída ‘S’)

Os testes 1 e 8 não possuem nenhuma saída de veículos. Portanto, antes de começar a implementar essa parte, garanta que o seu código está passando nesses testes. Caso contrário, confira as demais partes do seu código antes de continuar!

Verifique se a placa existe no seu registro. Se existir, pegue a lista de coordenadas associada a ela e transforme essas posições de volta em .. Não se esqueça de remover o veículo do registro após a saída.


3. Problemas e Erros Comuns

Fique atento a estes pontos durante a implementação, pois eles costumam causar a maioria dos travamentos nos testes:

O Erro de “Sujar” a Matriz (Sobreposição Parcial):

Imagine que você está verificando se um carro 2x3 cabe. Você começa a mudar os espaços para C, mas no último espaço descobre uma parede (#). O carro não cabe! Mas agora você já alterou a matriz.

  • Solução: Primeiro, apenas verifique se todos os espaços estão livres. Só depois de confirmar que 100% da área está limpa, efetivamente escreva o C ou M.

Acesso Fora dos Limites (IndexError):

Se a matriz tem 5 colunas, os índices vão de 0 a 4. Se você tentar encaixar um carro de largura 3 a partir da coluna 3, você precisará acessar as colunas 3, 4 e 5. A coluna 5 não existe e seu programa vai “quebrar”. Verifique se (linha + altura_do_veiculo) e (coluna + largura_do_veiculo) não estouram os limites de l e c antes de olhar o que tem na matriz.

Ordem de Tentativa Vertical/Horizontal:

O enunciado diz: “Para cada espaço, ele tenta ’encaixar’ o veículo primeiro na horizontal; se não couber, tenta na vertical”. Não faça uma busca pela matriz inteira na horizontal para só depois fazer uma busca inteira na vertical. A tentativa é feita a cada coordenada específica.

Saída de Placas Inexistentes:

O programa de testes pode tentar remover um veículo que não conseguiu vaga ou que já foi removido. Se você tentar buscar uma chave que não existe em um dicionário (ex: dicionario[placa_falsa]), o Python lançará um KeyError. Use o operador in (ex: if placa in dicionario:) para verificar se o carro está lá antes de tentar removê-lo.

Impressão do Resultado:

No final, a matriz deve ser impressa juntando os caracteres novamente. Se sua matriz é uma lista de listas, lembre-se de usar "".join(linha) ou iterar imprimindo os elementos juntos ao apresentar a saída.


Bom trabalho no desenvolvimento do código! Testem cada comando isoladamente antes de juntar tudo no programa final e podem me mandar as dúvidas por email!