Algoritmia - Esperal cuadrada

 
Vista:

Esperal cuadrada

Publicado por pablofsa (1 intervención) el 17/04/2006 18:23:08
Hola comunidad, hace tiempo que estoy intentando resolver un algoritmo para este problema, Alguien me puede ayudar , ya que intente varias formas de generar los puntos y no termino de armar nunca la solucion.
Desde ya gracias
Aqui va me consigna:

Consideremos una \"espiral cuadrada\" que parte del origen de coordenadas y toca consecutivamente los puntos (1,0), (1,1), (0,1), (-1,1), (-1,0), (-1,-1), (0,-1), (1,-1), (2,-1), etc.. De esta manera todos los puntos de coordenadas enteras pertenecen a la espiral. Partiendo del punto inicial (0,0), dichos puntos son numerados en forma consecutiva con los enteros no negativos 0, 1, 2, 3, 4, ... etc..
Diseñar un programa que solucione los siguientes problemas:

A- Determinar las coordenadas de un punto de la espiral considerada, numerado por \"n\", donde \"n\" es un entero no negativo dado. B- Determinar el entero no negativo \"n\", correspondiente a un punto de coordenadas enteras (x,y).
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Esperal cuadrada

Publicado por Alejandro (307 intervenciones) el 05/03/2024 21:16:19
Pablofsa, aquí te dejo un programa en Python que resuelve los problemas A y B:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def coordenadas_a_partir_de_n(n):
    if n == 0:
        return (0, 0)
 
    k = int((n - 1)**0.5)
    if k % 2 == 0:
        m = k
    else:
        m = k + 1
 
    if n >= m**2 and n <= m**2 + m:
        return (m - (m**2 + m - n), m)
    elif n > m**2 + m and n <= (m + 1)**2:
        return (-m, (m + 1)**2 - n)
    elif n > (m + 1)**2 and n <= (m + 1)**2 + m + 1:
        return (n - (m + 1)**2 - m - 1, -m)
    else:
        return (m + 1, n - (m + 1)**2 - m - 2)
 
def n_a_partir_de_coordenadas(x, y):
    m = max(abs(x), abs(y))
    if x == m:
        return (2 * m - 1)**2 + x + y
    elif y == m:
        return (2 * m - 1)**2 + 3 * m + x
    elif x == -m:
        return (2 * m + 1)**2 - y
    else:
        return (2 * m + 1)**2 + m - x
 
# Ejemplo de uso
n_ejemplo = 10
coordenadas = coordenadas_a_partir_de_n(n_ejemplo)
n_obtenido = n_a_partir_de_coordenadas(*coordenadas)
 
print(f"Coordenadas para n={n_ejemplo}: {coordenadas}")
print(f"N para coordenadas {coordenadas}: {n_obtenido}")

Este programa utiliza una lógica basada en la posición relativa del número en la espiral para calcular tanto las coordenadas a partir de n como n a partir de coordenadas. Puedes ajustar este código según tus necesidades y el lenguaje de programación que prefieras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar