Professional Documents
Culture Documents
1 Solução em O(1)
1.1 Lógica utilizada
1
Logo, é possı́vel encontrar qualquer ponto na espiral sabendo entre quais
pontos dessas diagonais ele se encontra e fazendo uma correção de coordenadas
de módulo da diferença entre o ponto da entrada e o ponto das diagonais mais
próximo.
1.2 Implementação
Inı́cio do método em O(1), que recebe a variável n como parâmetro:
def odeum(n):
√
Verifica se n é par, e inicializa os valores de lado (lado do quadrado), antes
(ponto anterior a n na espiral) e depois (ponto depois de n na espiral) :
if int(sqrt(n))%2==0 :
lado=int(sqrt(n))
antes=lado*lado
depois=(lado+1)*(lado+1)
Identifica em qual aresta do quadrado correspondente o ponto n se encontra
usando a média simples dos pontos antes e depois, que é o ı́ndice do outro
vértice do quadrado, como parâmetro. Se o ponto n estiver antes do vértice, ele
se encontra na aresta de baixo do quadrado. A correção no eixo X é a diferença
entre o quadrado par mais próximo e o ponto:
if n<=(antes+depois)/2:
x = y = -1*lado/2
passos=n-antes
x+=passos
Se o ponto n estiver depois do vértice, ele se encontra na aresta da direita do
quadrado. A correção no eixo Y é a diferença entre o quadrado ı́mpar mais
próximo e o ponto, que é negativa:
else:
y = -1*lado/2+(lado+1)
x = -1*lado/2+lado
passos=n-depois
y+=passos
√
Como n não é par, é ı́mpar. Os valores de lado (lado do quadrado), antes
(ponto anterior a n na espiral) e depois (ponto depois de n na espiral) são
inicializados :
else:
lado=int(sqrt(n))+1
antes=(lado-1)*(lado-1)
depois=lado*lado
Se o ponto n estiver antes do vértice, ele se encontra na aresta de cima do
quadrado. A correção no eixo X é a diferença entre o quadrado par mais próximo
e o ponto:
2
if n<=(antes+depois)/2 :
y = -1*lado/2+lado
x = -1*lado/2+(lado-1)
passos=n-antes
x-=passos
Se o ponto n estiver depois do vértice, ele se encontra na aresta da esquerda
do quadrado. A correção no eixo Y é a diferença entre o quadrado par mais
próximo e o ponto, que é negativa:
else:
x = y= -1*(lado/2)
passos=n-depois
y-=passos
2 Solução em O(n)
2.1 Lógica Utilizada
A espiral quadrada é desenhada por movimentos unitários que se trocam de
direção em PA, de maneira que à partir do ponto 0 = (0,0), o ponto 1 será obtido
incrementando de 1 unidade em y, sendo ele (0,1). O ponto 2 será encontrado
subtraindo 1 unidade de x, sendo ele (-1,1). À seguir, deve-se subtrair 1 unidade
de y, para encontrar o ponto 3 = (-1,0) e em seguida subtrair 1 unidade denovo
de y, totalizando 4 = (-1,-1).
Em seguida, muda-se a direção e seguem-se mais dois passos. Outra mu-
dança, mais três passos, e assim sucessivamente. Sempre anda-se 1 unidades em
x e y, em seguida 2 unidades em x e y, 3 unidades e em diante, até chegar-se no
ponto desejado.
É possı́vel perceber 4 fases de movimento:
1. aumenta coordenada Y
2. diminue coordenada X
3. diminue coordenada Y
4. aumenta coordenada X
A cada duas fases, o número de passos em cada fase aumenta.
2.2 Implementação
Inı́cio do método em O(n), que recebe um número n como parâmetro
def oden(n):
3
Inicializa as listas com as fases de y e x, fx e fy, de maneira que ao incrementar
a referência ao ı́ndice destas listas, a direção do movimento mude corretamente.
fx=[0,-1,0,1]
fy=[1,0,-1,0]
contapasso=npassos=1
duasvezes = fase = x = y = 0