Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Jonhy_xc

#1
Cita de: Loretz en 24 Febrero 2019, 07:11 AM
Debe haber por ahí alguna fórmula genial, de esas del tipo (a+b)^2  que nos deje a todos con la boca abierta, pero andando a pie, siguiendo la descripción más pedestre posible, mi algoritmo es este:

#include <iostream>
#include <cmath>
#include <array>

int main()
{
    // el primer círculo empieza en 2 y termina en 9
    // el segundo empieza en 10 y termina en 25
    // el tercero ... de 26 a 49 ...

    // Claramente, cada círculo empieza donde termina el anterior y
    // terminan en 9 (3*3) o en 25 (5*5) o en 49 (7*7) ... [los cuadrados del número de elementos de sus lados]

    // También, cada círculo tiene elementos que están más próximos al centro y están ubicados en cruz:

    // Se ve que en la rama de la derecha de esa cruz están:
    // el 2 (primer círculo),
    // el 11 (su número de círculo + los elementos del círculo anterior = 2 + 9),
    // el 28 (su número de círculo + los elementos del círculo anterior = 3 + 25).
    // y lo mismo para los siguientes...

    // Mirando también en las otras direcciones,
    // el primer círculo tiene en esa cruz al 2, que es por donde empieza,
    // y en las otras ramas al 4 (o sea, el 2 + su número de elementos por lado = 4),
    // tiene también al 6 (4 + su número de elementos por lado = 6)
    // y al 8 (6 + su número de elementos por lado -1 == 8).
    // Así que para el primer círculo esa cruz está formada por el 2, 4, 6, 8.

    // Lo mismo para los otros círculos:
    // el segundo círculo tiene al 11, 15, 19 y 23.

    // Cada círculo va a tener 4 números sobre la cruz:
    // el primero que está en el brazo horizontal de la derecha
    // y los otros tres distando entre sí la cantidad de elementos en cada lado.

    // Bueno, eso es todo.


    // Para calcular la distancia al centro de un número cualquiera habrá que calcular
    // la distancia a la rama más próxima de la cruz y sumar su número de círculo.

    // Por ejemplo: dado un númeo cualquiera:

    int n;
    std::cout << "numero: ";
    std::cin >> n;

    // Se puede determinar a qué círculo pertenece:
    int c = 0;
    for (int i = 1; ; i += 2, ++c) {  // 1, 3, 5, 7, ...
        if (i*i >= n) {
            break;
        }
    }
    std::cout << n << " pertenece al circulo " << c << '\n';

    // Este círculo tiene 4 números sobre la cruz central:
    std::array<int, 4> cruz;

    // El primero (rama de la derecha) es:
    cruz[0] = c + (2 * c - 1)*(2 * c - 1);  // su número de círculo más los elementos del círculo anterior

    // y los otros tres van a ser:
    for (int i = 1; i < 4; ++i) {
        cruz[i] = cruz[i - 1] + c * 2; // número anterior en la cruz + cantidad de elementos del lado
    }

    std::cout << "los elementos de la cruz son: ";
    for (const auto& i : cruz) {
        std::cout << i << "  ";
    }
    std::cout << '\n';

   
    // Ahora, la distancia al centro de este número es:
    // la distancia al elemento de la cruz más cercano + su número de círculo:

    int dist_cruz = 1000; // absurdamente grande
    for (int i = 0; i < 4; ++i) {
        if(abs(cruz[i] - n) < dist_cruz) {
            dist_cruz = abs(cruz[i] - n);
        }
    }
    int distancia = dist_cruz + c;

    std::cout << "distancia al centro = " << distancia << '\n';
}






Muchísimas gracias!!
#2
Programación C/C++ / Ayuda.
22 Febrero 2019, 19:22 PM
Hola,

Necesitaría ayuda con un "problema" que consiste en calcular la distancia mínima de un número hasta el 1 en la espitar de Ulam. Solo te darían un número y la espiral de Ulam es infinita.

Se puede comprobar que los dígitos (comenzando por el 1) están dispuestos siguiendo un patrón en espiral de dentro hacia afuera.

17 16 15 14 13
18 5 4 3 12
19 6 1 2 11
20 7 8 9 10
21 22 23 --> ...

Se nos pide calcular la distancia más corta (distancia manhattan)
de un número entero n hasta el 1. Para calcular esta distancia sólo se
permiten movimientos hacia arriba, abajo, izquierda y derecha.

Un ejemplo sería: La distancia según este cálculo del 7 al 1 es 2.

Muchas gracias de antemano.