O Problema dos peões da Maratona 2003

11 respostas
Paulo_Silveira

Abri esse tópico pela notícia que está no front do guj.com.br. é sobre o problema C, que pode ser encontrado em http://maratona.ime.usp.br/problem_set.pdf

A nossa solução está em:
http://www.paulo.com.br/temp/pawns.java

Um teste que é interessante fazer, para ver se sua solução está rápida o suficiente é:

2 8 37 14
1 1 11
1 60 1
2 33 60 54
6 9 11 4 13 6 15 19
0

Submeta a sua! Nós fizemos esse programa em java e acreditamos que não exista como otimizar este programa em relação a quantidade de tabuleiros visitados, mas podemos estar enganados! Alias, devemos estar ja que o programa foi recusado por time limit na competicao.

11 Respostas

Daniel_Quirino_Olive

… é ???

V

Paulo, você poderia disponibilizar também a solução de vocês para os outros programas que vocês fizeram?

Paulo_Silveira

infelizmente a gente soh imprimiu esse, que foi o que a gente nao passou… mas a gente esta pensando em criar um repositorio de solucoes desses problemas em java, para o ano que vem.

B

Paulo,

O link para o pdf está quebrado? Removeram o arquivo?

Já tentei algumas vezes ver o problema e não consegui.

Gustavo GUilherme BacK

Paulo_Silveira

pelo que vi estava fora o ar, mas ja voltou:
http://maratona.ime.usp.br/problem_set.pdf

louds

Paulo, você chegou a ver oque no seu programa ficou lento? Fazer algum profiling?
Me parece que se você tivesse utilizado um heap no lugar de uma lista-ligada para representar os próximos tabuleiros o programa poderia rodar mais rápido.
Outra coisa, vcs chegaram a pensar em resolver de outra forma? Em vez de simplesmente fazer o cavalo ir andando, pq não ir selecionando lista de alvos e testando a viabilidade delas?
Caramba, aqui rodou rápido pacas com a entrada que voce proveu, alguns milisegundos! Foi por tempo mesmo?

Paulo_Silveira

louds! exatamente os pensamentos que voce teve a gente teve la na hora. hehehe, voce entendeu esse codigo que esta uma zona hein?

bem, o heap nao adianta muito nao, a gente ateh tinha feito com TreeSet que tambem removia em O(logn). a remocao na lista ligada eh super rapido, mesmo sendo O(n), ja que a gente usa A* (pode ver que tem um comparator que usa uma heuristica) e tem poucos caras na fila. Mas vc tem razao, eh um lugar que da pra melhorar em vez de ficar pegando min/max.

parece que nao eh por tempo certo? a gente acha que tem algum caso particular que entra em loop infinito, por causa do nosso while true ai.

e acredite se quiser, o pessoal que conseguiu passar esse ai fez busca em PROFUNDIDADE exaustiva! fez TODAS as jogadas e escolheu a mais curta. Brincadeira??? nao eh possivel que uma busca exaustiva em C seja mais rapida que A* em java, nao mesmo…

de qualquer maneira, estamos esperando as solucoes dos juizes, junto com os testes deles…

sobre a ideia de fazer ele cacar os peoes, tentamos, mas ele dava resposta errada se a gente soh considerasse as posicoes que poderiam comer.

louds

bizarro em…
O espaço total de pesquisa não me parece ser suficientemente grande para valer a pena usar A*, vejamos:

São no máximo 8 passos, com 8 possibilidades por passo, isso gera um pior caso de 2^24 testes, porem isso dificilmente vai acontecer se voce colocar 1 pouco de heuristica.

Vou implementar usando busca em profundidade e ai comparamos os resultados.

Paulo_Silveira

a gente fez alguns testes.
fazendo uma busca em largura secona, sem cache nem nada, mas fazendo um pruning que percebe que aquele tabuleiro ja esta perdido, a gente teve de visitar 2500 tabuleiros para resolver o problema com 6 peoes comiveis.

usando o A*, isso diminui para 25!!!

louds, posta seus resultados pra gente depois por favor! testa com aqueles caras e posta quantos tabuleiros visitados.

Betinhum

Estava estudando o capítulo de array do Java Como Programar e acabei fazendo uma versão “jogável” do Passeio do Cavalo. É fora do tópico, mas quem estiver afim de dar uma conferida: :stuck_out_tongue: .

Guilherme_Silveira

muda o while(true) para while(lista.size()!=0)
mas deveria dar na mesma, pq o while(true) so ficaria em loop caso os objetos da lista nao estivessem sido removidos ou nao existisse um fim de profundidade (8 passos)

Criado 11 de novembro de 2003
Ultima resposta 13 de nov. de 2003
Respostas 11
Participantes 7