Page 2 of 2

Posted: Mon Apr 18, 2005 3:32 am
by Antonio Ocampo
Hi david, you have to delete your code in your previous post.

About

Code: Select all

I changed the code to avoid printing -0.000, switched back to doubles (instead of long doubles) and got AC. 
These are frequent troubles in our source codes.

Keep posting

10834 - The Story of Two Coins. Help, please!

Posted: Sat Apr 30, 2005 7:47 pm
by Victor Barinov
Hello everybody!
I can not understand what is wrong with my code. I always get WA. Maby anyone give me some tests or hints?.

Thanks!

Here is my code:

Code: Select all

#include  <stdio.h>
#include  <math.h>

#define  Pi 3.1415926535897932384626433832795
#define  eps 1e-8

int  main()
{
  int  cas = 0;
  double  R, r, tx, ty, px, py;
  double  alpha, gamma, phi1, phi2;
  
  while  (1)
  {
    scanf("%lf%lf%lf%lf", &R, &r, &tx, &ty);
    if  (r == 0.0 && R == 0.0)  break;
    
    cas++;
    printf("Case %d:\n", cas);
    
    if  (tx*tx + ty*ty - R*R <= eps  ||  tx*tx + ty*ty - (R+2.0*r)*(R+2.0*r) >= -eps) {
      printf("IMPOSSIBLE\n"); continue; }
    
    alpha = acos(tx / sqrt(tx*tx + ty*ty));
    if  (ty < 0)  alpha = 2.0*Pi - alpha;
    
    gamma = acos( (R*R + tx*tx + ty*ty + 2.0*R*r) / (2.0*(R+r)*sqrt(tx*tx + ty*ty)) );
    
    phi1 = alpha - gamma;  if  (phi1 < 0.0)  phi1 += 2.0*Pi;
    phi2 = alpha + gamma;
    
    if  (phi1 > phi2) {
      alpha = phi1;
      phi1 = phi2;
      phi2 = alpha;
    }
    
    px = (R+r-r*sin(phi1*R/r))*cos(phi1) - r*cos(phi1*R/r)*sin(phi1);
    py = (R+r-r*sin(phi1*R/r))*sin(phi1) + r*cos(phi1*R/r)*cos(phi1);
    if  (px < 0.0  &&  px > -0.0005)  px = 0.0;
    if  (py < 0.0  &&  py > -0.0005)  py = 0.0;
    printf("%.3lf %.3lf\n", px, py);
    
    px = (R+r-r*sin(phi2*R/r))*cos(phi2) - r*cos(phi2*R/r)*sin(phi2);
    py = (R+r-r*sin(phi2*R/r))*sin(phi2) + r*cos(phi2*R/r)*cos(phi2);
    if  (px < 0.0  &&  px > -0.0005)  px = 0.0;
    if  (py < 0.0  &&  py > -0.0005)  py = 0.0;
    printf("%.3lf %.3lf\n", px, py);
  }
  
  return 0;
}


hmm

Posted: Sun May 01, 2005 4:27 am
by shahriar_manzoor
I am at a PC now which does not have a C/C++ compiler so I could not check. But does your program consider the following line

"The coordinates of P should be printed in chronological order (If a position is reached by the second coin before the other position then the corresponding coordinates of P should be printed first)."

Posted: Fri Nov 03, 2006 1:42 pm
by filipius
Hi,

You made this question a long time ago, but I used your code to understand what was wrong with mine. Finally, I got accepted and in the process I found your bug (well, at least one bug - and, of course you may have found it already, but this can help someone else):

In same cases, your angle phi2 is larger than 2 * pi.
This makes a difference in the position of P, because the coins have different sizes.
For instance, consider the following input:

830 714 1892.70526225 -288.736962726

your program's wrong output:
1404.649 -39.541
801.511 390.331

correct output:

1204.633 959.680
1404.649 -39.541

You must normalize your angles.

Cheers,

Filipe Araujo.
Univ. of Coimbra
Portugal