Rastrear exaustivamente o movimento da bola é o mais fácil de programar, e também não é tão ruim em termos de eficiência. Você deve manter uma tabela de hash de todos os estados da bola que foram vistos anteriormente (onde o estado de uma bola é o quadrado da grade em que se encontra e em qual direção está indo); se você repetir um estado passado, saberá que ele será repetido para sempre e poderá parar de rastrear o movimento. Dessa forma, rastrear o movimento da bola levará no máximoO(mn) tempo no pior dos casos.
Isso pode ser acelerado usando um pouco de álgebra simples para calcular "dado o estado atual, qual é o próximo muro que a bola atingirá?" noO(1) tempo - isso será mais rápido, mas não mais fácil.
Existe uma solução mais elegante e eficiente, baseada na teoria dos números e na técnica de Tom Van der Zanden de estender a grade infinitamente .
Imagine um universo paralelo onde a bola viaja em linha reta em uma grade infinita; como diz Tom, ricochetear nas paredes do nosso universo equivale a continuar em linha reta no universo paralelo. Este é o primeiro insight que usaremos.
Vamos elaborar as implicações desse insight. Em nosso universo, a bola começa com alguma coordenada inicial(x0,y0), movendo NE, e queremos saber se alguma vez alcançará as coordenadas (x′,y′). O que isso significa no universo infinito? Bem, imagine colocar minas em coordenadas(x′,y′), (x′,2n−y′), (x′,y′+2n), (x′, 4 n−y′), ..., ( 2 m -x′,y′), ( 2 m -x′, 2 n -y′), ... - em particular, nas coordenadas ( 2 i m ±x′,2jn±y′) Onde i,jintervalo sobre todos os números inteiros. Então eu afirmo que a bola acabará por chegar às coordenadas(x′,y′)em nosso universo, se e somente se a bola eventualmente atingir uma mina no universo paralelo. Portanto, nosso problema se reduz a perguntar: no universo paralelo, a bola atingirá uma mina?
A segunda percepção é que podemos usar a teoria dos números para responder a essa pergunta. Em particular, depois det unidades de tempo, a bola estará na posição (x0 0+ t ,y0 0+t)no universo paralelo. Queremos saber se existem números inteiros.t,i,j de tal modo que x0+t=2im±x′ e y0+t=2jn±y′. Reorganizando essas equações e usando a linguagem da aritmética modular, estamos perguntando se existe um número inteiro.t de modo que ambas as seguintes equações sejam válidas:
tt≡±x′−x0(mod2m),≡±y′−y0(mod2n).
Agora estamos prontos para aplicar a teoria dos números. Em particular, isso é perfeitamente configurado para aplicar o teorema chinês do restante . Definirg=2gcd(m,n). Então o sistema de equações acima tem uma solução nos números inteiros se e somente se
±x′−x0≡±y′−y0(modg).
Em outras palavras, devemos verificar as quatro condições a seguir:
- x′−x0≡y′−y0(modg)
- −x′−x0≡y′−y0(modg)
- x′−x0≡−y′−y0(modg)
- −x′−x0≡−y′−y0(modg)
Se qualquer uma dessas quatro condições se mantiver, existe uma solução para o sistema de equações acima e, portanto, no universo paralelo, a bola atingirá alguma mina; se nenhuma dessas quatro condições se mantiver, a bola nunca atingirá nenhuma mina. (Essas 4 condições são as condições relevantes se a bola estiver viajando inicialmente NE. As outras direções podem ser manipuladas simetricamente com um conjunto semelhante de 4 condições.)
Reformulando em termos do problema original, obtemos uma solução para o problema original que é fácil de implementar e é executada em O(1)Tempo. Computamosg=2gcd(m,n)e verifique as quatro condições na lista de marcadores acima. Se alguma das quatro condições persistir, a resposta é sim: a bola acabará por chegar ao ponto(x′,y′). Se nenhuma das quatro condições se mantiver, a resposta é não: a bola nunca chegará ao ponto(x′,y′).