jueves, 19 de abril de 2012

Burrito Amarrado

Problema B  Burrito amarrado

Entrada: burrito.in 
Salida: estándar.
Máxima memoria: 32 MB
Tiempo límite: 10 segundos 
Descripción

 Un burro se encuentra en un corral circular de radio R amarrado con una cuerda mágica a un poste situado en el centro del corral. Inicialmente el burro se encuentra junto al poste y comienza a caminar hacia el norte. La cuerda se pone tensa cuando el burro llega a la mitad del camino entre el poste y el corral. En ese momento el burro da vuelta 90º a la derecha y sigue caminando. De nuevo, la cuerda mágica únicamente le permite llegar hasta la mitad del camino entre el punto donde dio vuelta y el corral. Como el burro quiere escapar, continúa caminando de esta manera hasta que por n-ésima vez la cuerda lo obliga a detenerse. Tu trabajo es determinar la distancia entre el burro y el poste en ese momento. 

Entrada

 Cada caso de entrada consiste de una línea que contiene dos enteros R y n separados por un espacio (1 ≤ R, n ≤ 10000). La última línea de la entrada contiene dos ceros, ese caso no debe procesarse. 

Salida

 Para cada caso de entrada, imprime una línea que contenga la distancia entre el burro y el poste con 2 decimales de precisión.

Ejemplo de entrada
 
120 1
120 4
0 0

Ejemplo de salida
 
60.00
40.69


Solucion

Bueno en este problema se soluciona teniendo en cuenta que habran cuatro casos ya que gira en 0, 90 , 180 , 270 grados. 

El valor de X y de Y se altera sumando o restan la distancia del punto actual al corral de esta manera 

y = (y +  sqrt(r*r-x*x))/2;
 x = (x +  sqrt(r*r-y*y))/2;
 y = (y -  sqrt(r*r-x*x))/2;
 x = (x -  sqrt(r*r-y*y))/2;

de acuerdo a los cuatro casos y a los signos en ellos.
finalmente 
se usa el teorema de pitagoras para mostrar
la hipotenusa.


#include 
#include 
#include 
using namespace std;

int main()
{
    int r;
    int n;
    cin >> r;
    cin >> n;
    while(r+n!=0 )
    {

        double x=0.0;
        double y=0.0;
        while(n--)
        {
            if (n%4==1) y = (y +  sqrt(r*r-x*x))/2;
            if (n%4==2) x = (x +  sqrt(r*r-y*y))/2;
            if (n%4==3) y = (y -  sqrt(r*r-x*x))/2;
            if (n%4==0) x = (x -  sqrt(r*r-y*y))/2;

        }
        cout.precision(2);

        cout << fixed << sqrt(x*x+y*y) <> r;
        cin >> n;

    }

}

2 comentarios: