Cita de: CalgaryCorpus en 22 Febrero 2019, 21:05 PMMás o menos es así... puede sumar o restar 1 según el caso, es decir según lo que dice si para 7 distancia es 2, para 1 distancia es 1, entonces debe sumarse 1...
Tiene cara de ser la parte entera de la mitad de la raiz cuadrada del numero.
Está mal dibujado, los cuadrados pares son las diganoles de las esquinas a la izquierda arriba y los cuadrados impares son las diagonales de la esquina abajo a la derecha...
d0 = int(int(sqr(n))/2) +1
Ahora bien, precisa algún ajuste pués difiere... yo toda la vida lo he visto dibujado empezando con el 0, así los cuadrados pares son diagonales al 0, y los cuadrados impares diagonales al 1...
...por otro lado como es la distancia Manhattan lo que se pide y no la euclidiana, no basta con una simple fórmula, pero para los cuadrados (las 4 diagnales) es esta:
d1 = int(sqr(n)) +1
...y el resto de casos debe resolverse con pequeños ajustes... conociendo los valores al este, oeste, norte y sur (según cada caso) entre el cuadrado menor que encaja y el siquiente que cubre al número pedido.
Dicho de otro modo, hay que calcular de qué cuadrado queda más cerca de 'n', para saber porque lado queda afectado (vertical/horizontal al centro) hasta el que tiene que llegar, entonces la fórmula general sería... Desde ese punto 'p' al N,E,S,O (N=norte, E=este, etc...) el valor es:
Si queda más cerca del cuadrado mayor que 'n':
d2 = (d0 + (n-p))
Si queda más cerca del cuadrado menor que 'n':
d2 = (d0 + (p-n))
Nótese que igual que d1 es la distancia para las diagonales d0, los es para los valores en N,E,S,O...
Así que dejo a tu esfuerzo calcuar 'p'... que con logaritmo 2 resulta fácil calcular...