Dev - C++ - Distancia espiral Ulam

 
Vista:

Distancia espiral Ulam

Publicado por Gpm12 (1 intervención) el 25/02/2019 18:58:07
Dada una matriz bidimensional como la siguiente:
16 15 14 13
17 5 4 3 12
18 6 1 2 11
19 7 8 9 10
20 21 22 23 ...

Se puede comprobar que los dígitos (comenzando por el 1) están dispuestos siguiendo un patrón en espiral de dentro hacia afuera.
A esta forma de disponer los números naturales en espiral se la conoce como
la espiral de Ulam.
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.

¡¡¡¡Porfavor es urgente GRACIAS!!!!!

posdata(la matriz no la tengo ni se puede hacer osea que no se puede recorrer )
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 Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Distancia espiral Ulam

Publicado por Alfil (1444 intervenciones) el 27/02/2019 06:58:17
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
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main(){
    int n;
    cout << "Numero: ";
    cin >> n;
 
    int indice = 0;     // indice mínimo necesario de la matriz
    for( int i = 1; i * i <= n; i += 2 ) {
        indice++;
    }
 
     // almacena los 4 puntos cardinales de 1 respecto a n
    int cardinales[4];
 
    // primer punto cardinal
    cardinales[0] = indice + (2 * indice - 1) * (2 * indice - 1);
 
    // resto de puntos cardinales
    for( int i = 1; i < 4; i++ ){
        cardinales[i] = cardinales[i - 1] + indice * 2;
    }
 
    // distancia al mayor cardinal menor que n
    int distancia = abs(cardinales[0] - n);
    for( int i = 1; i < 4; i++ ) {
        if(  abs(cardinales[i] - n) < distancia )
            distancia = abs(cardinales[i] - n);
    }
 
    float raiz = sqrt(n);
    int raiz_entera = (int)raiz;
 
    int manhatan = distancia + indice;
 
    // Si n es impar y su raiz cuadrada es entera
    if( (n % 2 != 0) && (raiz == raiz_entera) )
        manhatan = manhatan - 2;
 
    cout << "\nDistancia Manhatan al #1: " << manhatan << endl;
 
    return 0;
}
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
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Distancia espiral Ulam

Publicado por Thanatos (199 intervenciones) el 27/02/2019 12:32:46
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
#include <cmath>
#include <iostream>
 
using namespace std;
 
int calcularDistancia(const int n);
 
int main() {
    int n;
 
    cout << "Numero: ";
    cin >> n;
 
    cout << "Distancia = " << calcularDistancia(n) << '\n';
 
    return 0;
}
 
int calcularDistancia(const int n) {
    if (n < 1) {
        return -1;  // Error
    } else if (n == 1) {
        return 0;
    }
 
    int nivel = static_cast<int>(ceil(sqrt(n)) / 2.0);
    int diferNivel = static_cast<int>(n - pow(2 * nivel - 1, 2.0)) % (4 * (2 * nivel - 1) + 4);
    int distLateral = abs(diferNivel % (2 * nivel) - nivel);
 
    return nivel + distLateral;
}
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