Introdução relacionada a crianças
Sempre que levo meus filhos a um parque de diversões, eles ficam mais nervosos quanto mais perto estamos do parque, com o pico nervoso quando estamos no estacionamento e não encontramos lugar para estacionar. Então, decidi que preciso de um método para encontrar o espaço de estacionamento gratuito mais próximo para minimizar o tempo gasto no estacionamento.
Introdução técnica
Imagine uma representação de um estacionamento como este:
*****************
* *
* ··CC··C··CC·· *
* ************* *
* ··CCCCCCCCC·· *
* *
**********E******
Nesta representação, a *significa uma parede, um ·espaço de estacionamento gratuito, Eo ponto de entrada e Cum carro já estacionado. Todo espaço em branco é uma posição que o carro a ser estacionado pode usar para se movimentar pelo estacionamento. Agora vamos estender esse conceito para 3D para criar um estacionamento de vários níveis:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Os números 1, 2e 3representam as ligações entre os níveis. O 1do primeiro andar se conecta ao 1do segundo andar, de modo que um carro entrando na 1posição no primeiro andar apareça na 1posição no segundo andar.
Desafio
Fornecendo um esquema de um estacionamento como o mostrado anteriormente, escreva o programa mais curto que calcula a distância até o estacionamento mais próximo, de acordo com o seguinte
Regras
- A entrada será uma matriz de caracteres 3D ou uma matriz de cadeias 2D ou equivalente, e a saída será um número inteiro único representando o número de etapas que o carro deve executar para chegar ao espaço de estacionamento gratuito mais próximo. Se você receber uma matriz de caracteres 3D, o primeiro índice poderá representar o número do andar e o segundo e o terceiro índices a posição (x, y) de cada andar, mas isso depende de você.
- Não haverá mais de 9 rampas, representadas por
[1-9]. - O carro parte da
Eposição (haverá apenas um ponto de entrada por mapa) e se move usando os espaços em branco em uma das quatro direções de cada vez: para cima, para baixo, esquerda, direita. O carro também pode entrar em·posições e[1-9]posições. - Cada mudança de posição (degrau) conta como 1, e toda vez que o carro passa de um andar para outro conta como 3, pois o carro deve subir uma rampa. Nesse caso, o movimento de um espaço em branco ao lado de um
1para o1próprio é o que conta como 3 etapas, porque, como resultado desse movimento, o carro aparece na1posição no outro andar. - O carro não pode ir além dos limites da matriz.
- A contagem terminará quando o carro a ser estacionado estiver na mesma posição que a
·. Se não houver vagas de estacionamento gratuitas acessíveis, você poderá retornar zero, um número inteiro negativo, um valor nulo ou um erro.
Exemplos
No exemplo acima, o resultado seria 32, pois é mais barato ir para o quarto andar e estacionar no estacionamento mais próximo, perto do 3 . Os lugares de estacionamento gratuitos mais próximos no terceiro andar ficam a 33 e 34.
Outros exemplos:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Answer: 28 (now the parking space in the 2nd floor is closer)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 4 2 5 3 6 *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
4 * 5 1 6 2 * 3
**********E****** ***************** ***************** *****************
Answer: 24 (now it's better to go to ramp 4 and then to ramp 5 to the third floor)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * * * 3 * 2
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 3 * 2 * 1
**********E****** ***************** ***************** *****************
Answer: 16 (now the parking space in the 4th floor is closer)
1st floor 2nd floor 3rd floor 4th floor 5th floor
************ ************ ************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC 3 *·CCCCCCCC 4 *········C *
* * * * * * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2 *··CCCCCCC 3 *·······CC 4
************ ************ ************ ************ ************
Answer: 29 (both the nearest parking spaces at the 4th and 5th floors are at the same distance)
1st floor 2nd floor 3rd floor
************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC *
* * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2
************ ************ ************
Answer: -1 (no free parking space)
1st floor
************
* *
* *
* E*
************
Answer: -1 (no parking space at all)
1st floor
************
* ····· *
*· ****
* ····· * E
*********
Answer: -1 (the parking lot designer was a genius)
Alternativas
- Você pode usar os caracteres que deseja representar no mapa do estacionamento, basta especificar na sua resposta quais são os caracteres escolhidos e o que eles significam.
Isso é código-golfe , portanto, o programa / método / lambda / o mais curto para cada idioma pode ganhar!
Se você precisar de ajuda com o algoritmo, verifique minha implementação (não-gasta) em C # .