Parece que me meti em confusão. Literalmente. Deixei cair um monte de picles no chão e agora estão todos espalhados! Preciso que você me ajude a coletar todos eles. Ah, eu mencionei que tenho um monte de robôs sob meu comando? (Eles também estão espalhados por todo o lugar; sou muito ruim em organizar as coisas.)
Você deve receber informações na forma de:
P.......
..1..2..
.......P
........
P3PP...4
.......P
isto é, várias linhas de ambos .
, P
(salmoura), ou um dígito (identificação do robô). (Você pode supor que cada linha tenha o mesmo comprimento, preenchida com .
.) Você pode inserir essas linhas como uma matriz ou usar o STDIN ou ler em uma única linha separada por vírgula ou ler um arquivo ou fazer o que quiser gostaria de receber a entrada.
Sua saída deve estar na forma de n
linhas, onde n
é o ID do robô mais alto. (As IDs do robô sempre serão sequenciais, começando em 1.) Cada linha conterá o caminho do robô, formado pelas letras L
(esquerda), R
(direita), U
(para cima) e D
(para baixo). Por exemplo, aqui está um exemplo de saída para esse quebra-cabeça:
LLU
RDR
LRRR
D
Também pode ser
LLU RDR LRRR D
Ou
["LLU","RDR","LRRR","D"]
Ou qualquer formato que você desejar, desde que você saiba qual deve ser a solução.
Seu objetivo é encontrar a saída ideal, que é a que tem menos etapas. A quantidade de etapas é contada como a maior quantidade de etapas de todos os robôs. Por exemplo, o exemplo acima teve 4 etapas. Observe que pode haver várias soluções, mas você só precisa produzir uma.
Pontuação:
- Seu programa será executado com cada um dos 5 casos de teste (gerados aleatoriamente).
- Você deve adicionar as etapas de cada execução, e essa será sua pontuação.
- A pontuação total e cumulativa mais baixa vencerá.
- Você não pode codificar para essas entradas específicas. Seu código também deve funcionar para qualquer outra entrada.
- Os robôs podem passar um pelo outro.
- Seu programa deve ser determinístico, ou seja, a mesma saída para cada execução. Você pode usar um gerador de números aleatórios, desde que seja semeado e produza consistentemente os mesmos números em várias plataformas.
- Seu código deve ser executado dentro de 3 minutos para cada uma das entradas. (De preferência, muito menos.)
- Em caso de empate, a maioria dos votos positivos vencerá.
Aqui estão os casos de teste. Eles foram gerados aleatoriamente com um pequeno script Ruby que escrevi.
P.......1.
..........
P.....P...
..P.......
....P2....
...P.P....
.PP..P....
....P....P
PPPP....3.
.P..P.P..P
....P.....
P....1....
.P.....PP.
.PP....PP.
.2.P.P....
..P....P..
.P........
.....P.P..
P.....P...
.3.P.P....
..P..P..P.
..1....P.P
..........
.......2P.
...P....P3
.P...PP..P
.......P.P
..P..P..PP
..P.4P..P.
.......P..
..P...P...
.....P....
PPPP...P..
..P.......
...P......
.......P.1
.P..P....P
P2PP......
.P..P.....
..........
......PP.P
.P1..P.P..
......PP..
P..P....2.
.P.P3.....
....4..P..
.......PP.
..P5......
P.....P...
....PPP..P
Boa sorte, e não deixe os picles ficarem lá por muito tempo, ou eles estragam!
Ah, e por que picles, você pergunta?
Por que não?
fonte
Respostas:
Ruby, 15 + 26 + 17 + 26 + 17 = 101
Robô encontra picles!
Ok, aqui está uma linha de base para iniciar as pessoas, usando o seguinte algoritmo super ingênuo:
Aqui está o que parece para o Caso de Teste 1:
Obviamente, isso não é muito bom, mas é um começo!
Código:
Insere STDIN exatamente no formato do bloco de código do caso de teste na pergunta original. Aqui está o que é impresso para esses casos de teste:
fonte
Python, 16 + 15 + 14 + 20 + 12 = 77
Eu realmente não tenho nenhuma experiência anterior com problemas do tipo vendedor ambulante, mas eu tinha um pouco de tempo em minhas mãos, então pensei em tentar. Basicamente, ele tenta atribuir a cada bot certos picles, percorrendo-o por uma corrida preliminar, onde eles buscam os mais próximos e os mais distantes dos outros. Em seguida, força bruta a maneira mais eficiente de cada bot coletar seus pickles alocados.
Realmente não tenho ideia de quão viável esse método é, mas suspeito que não funcionaria bem para placas maiores com menos bots (a quarta placa já leva algumas vezes mais de dois minutos).
Código:
Resultado:
fonte