Estou no ponto (0,0)
de um mapa H
x, W
onde a altitude é representada por dígitos, por exemplo:
1132
2221
1230 # H = 3, W = 4
Eu gostaria de experimentar as vistas de todos os picos, que neste caso são as áreas com altitude 3
. No entanto, subir montanhas não é uma tarefa fácil, e também estou ficando sem tempo.
Desafio
O desafio é encontrar o caminho mais rápido para visitar todos os picos e voltar.
O programa mais curto vence.
Entrada
- H, W - altura e largura do mapa (Inteiros) (opcional, pode ser uma lista / tupla ou duas entradas inteiras separadas)
- O mapa, fornecido como
H
conjuntos deW
dígitos (0
-9
), em qualquer formato conveniente (lista 2D, sequência separada por novas linhas, etc.)
Saída
- Menor tempo para visitar todos os picos e retornar ao seu ponto de partida (Inteiro)
Condições
- A altitude de uma determinada área é representada por um dígito de
0
até9
. - O "pico" é definido pela área com a maior altitude.
- O caminho deve começar e terminar na área superior esquerda (0,0) .
- Você só pode mover-se para áreas adjacentes à sua área atual e não pode mover-se na diagonal.
- Leva 3 minutos para mudar de uma área para outra, se não houver mudança de altitude.
- Demora 11 minutos para subir; isto é, movendo-se de uma área para outra área que é exatamente a
1
unidade mais alta. - Demora 2 minutos para descer; isto é, movendo-se de uma área para outra área que é exatamente a
1
unidade mais baixa. - Você não pode mover - se para áreas que são mais do que
1
unidades mais altas ou mais baixas do que onde estão. (Você não pode ir de uma área com altitude1
para uma área adjacente com altitude, por exemplo3
)
- Um caminho para todos os picos é garantido
- O número máximo de picos é
15
.
Amostras
Entrada
4 5
32445
33434
21153
12343
Saída
96
Explicação
Você começa no canto superior esquerdo 3
. Você deve visitar os dois 5
s localizados em (0,4)
e (3,3)
voltar ao 3
at (0,0)
no menor tempo possível.
3 2 4->4->5
V ^
3->3->4 3 4
2 1 1 5 3
1 2 3 4 3 # 3 + 3 + 11 + 3 + 3 + 11 = 34 minutes to visit 1st peak
3 2 4 4 5
V
3 3 4 3 4
V
2 1 1 5 3
^ V
1 2 3 4<-3 # 2 + 2 + 3 + 11 + 11 = 29 minutes to visit 2nd
3 2 4 4 5
^
3 3 4 3 4
^
2 1 1 5 3
^ V
1<-2<-3<-4 3 # 2 + 2 + 2 + 2 + 11 + 11 + 3 = 33 minutes to come back
# 34 + 29 + 33 = 96 minutes total is the answer
Entrada
2 7
6787778
5777679
Saída
75
code-golf
path-finding
puzzle-solver
graph-theory
cozyconemotel
fonte
fonte
Respostas:
Mathematica
745681 bytesA idéia básica é fazer um gráfico ponderado de possíveis movimentos. Pesos são o tempo que leva para mudar de um lugar para o outro. O caminho com menos peso será o mais rápido.
Os dígitos de entrada são colocados em uma matriz retangular r por c (linhas por colunas) e, em seguida, três representações distintas entram em jogo: (1) um gráfico de grade r por c, em que cada vértice corresponde a uma célula na matriz, (2) (r c) por (r c) matriz de adjacência ponderada que mantém pesos correspondentes ao tempo que leva (2, 3 ou 11 minutos) para mover de um local (no gráfico da grade) para outro e (3) um direcionado , gráfico de adjacência ponderada construído a partir da matriz.
O gráfico de grade ajuda a determinar quais células (ou seja, quais vértices) são possivelmente alcançáveis de cada vértice - "possivelmente alcançáveis" porque uma célula vizinha não deve estar apenas à direita, esquerda, acima ou abaixo de uma determinada célula. Seu valor também deve estar a uma unidade de distância do vizinho (por exemplo, um 3 não se conecta a um vizinho 5 ou 1). Se o vértice
a
não estiver conectado ao vérticeb
, as células da matriz de adjacência {a, b} e {b, a} terão o valor ∞. Assim, o gráfico de adjacência ponderada não terá uma aresta de a para b, nem de b para a.O gráfico de adjacência ponderada serve para determinar a distância mínima (
GraphDistance
) e a rota mais curta entre todos os vértices. O caminho ideal deve começar com 1, tocar em cada um dos picos e retornar a 1. Nesse caso, a "rota mais curta" não é necessariamente aquela com menos movimentos. É o que tem o menor tempo total, medido em pesos das arestas.Golfe
Forma mais longa e mais legível
Testes
96
75
51
Explicação
Pense nas linhas 2-5 da seguinte entrada
como representando uma matriz com 4 linhas e 5 colunas:
onde cada vértice corresponde a um dígito da matriz de entrada: 3 está no vértice 1, 2 está no vértice 2, 4 está no vértice 3, outro 4 no vértice 4, 5 no vértice 5 etc. O gráfico da grade é apenas aproximado aproximação do gráfico que estamos buscando. Não é direcionado. Além disso, algumas das bordas estarão indisponíveis. (Lembre-se: não podemos passar de uma posição para outra com mais de uma unidade de altura acima ou abaixo da atual.) Mas o gráfico da grade permite encontrar facilmente os vértices que estão próximos a qualquer vértice escolhido. Isso reduz o número de arestas que precisamos considerar, no primeiro exemplo (uma grade de 4 por 5), de 400 (20 * 20) para 62 (31 * 2 é o número de arestas no gráfico de grade). No mesmo exemplo, apenas 48 das arestas estão operacionais; 14 não são.
A seguinte matriz de adjacência ponderada de 20 por 20 representa a distância entre todos os pares de vértices do gráfico de grade.
O código da chave que decide em qual número atribuir está abaixo.
A célula {1,2} - na indexação única - contém o valor 2 porque a mudança do vértice 1 para o vértice 2 é descendente. A célula {2,1} contém 11 porque a mudança do vértice 2 para o vértice 1 é subida. Os 3 nas células {1,6} e {6,1} significam que o movimento não é para cima nem para baixo. A célula {1,1} contém ∞ porque não está conectada a si mesma.
O gráfico a seguir mostra a estrutura subjacente à entrada acima. As setas coloridas mostram o caminho ideal do vértice 1 até os picos (em 5 e 14) e voltam para 1. As setas azuis correspondem a movimentos no mesmo nível (3 min); setas vermelhas significam subida (11 min.) e setas verdes indicam descida (2 min).
O caminho do vértice 1 (célula {1,1} para os dois picos e de volta ao vértice 1:
96
fonte
Pitão, 92 bytes
O formato de entrada é um dicionário coordenadas de mapeamento para alturas:
{(0, 0): 3, (0, 1): 2, (0, 2): 4, …}
. Ele encontra os caminhos mais rápidos entre todos os pares de pontos usando o algoritmo Floyd – Warshall e , em seguida, minimiza o tempo total do ciclo desejado em todas as permutações de picos.Experimente online
fonte