Você recebe uma grade mxn. Uma bola adimensional é colocada no centro de um dos quadrados da grade e começa a se mover em uma das quatro direções: nordeste, noroeste, sudeste ou sudoeste. A bola continua se movendo até atingir a borda do tabuleiro; nesse ponto, ela se recupera de acordo com as leis da Física.
Dado m, n, a posição e direção inicial (NE / NW / SE / SW) da bola, é possível determinar se a bola atingirá um quadrado de grade alvo especificado (x0, y0)?
É possível responder à pergunta traçando exaustivamente o movimento da bola, mas existe alguma alternativa mais fácil e eficiente? Qualquer indicação para literatura relacionada também seria muito apreciada.
algorithms
computational-geometry
Mandar Mitra
fonte
fonte
Respostas:
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,j intervalo 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:
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
Em outras palavras, devemos verificar as quatro condições a seguir:
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 emO(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′) .
fonte