You are on page 1of 4

TP1: Espiral Quadrada

Gustavo Monteiro Brunoro


brunoro@dcc.ufmg.br
27 de junho de 2009

1 Solução em O(1)
1.1 Lógica utilizada

Observando a representação do problema, podemos verificar a existência de


duas diagonais onde os elementos são quadrados inteiros. São elas:
1. Diagonal dos quadrados ı́mpares
2. Diagonal dos quadrados pares
Também é possı́vel observar que há quadrados envolvendo os pontos, e esses
quadrados tem lado com módulo igual a raiz quadrada do ponto da diagonal
das quadrados pares que o quadrado
√ contém. Ou seja, O quadrado de [1,8] tem
lado 2, pois contém o√ponto 4 e 4 = 2. O quadrado de [9,24] tem lado 4, pois
contém o ponto 16, e 16 = 4. √ √
Os pontos da diagonal ı́mpar têm coordenadas na forma ( lado−12 , lado
2 ), e
√ √
lado lado
os pontos da diagonal par têm coordenadas na forma(− 2 , − 2 ).

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

Cobrindo as 4 arestas do quadrado correspondente, o algoritmo pode encontrar


todos os pontos da espiral. O método retorna uma lista com as coordenadas da
espiral:
return [x,y]

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

You might also like