UVa 10387- Billiard

UVa 10387- Billiard

Table of Contents

1 题目

=============

 

Problem A: Billiard

In a billiard table with horizontal side  a  inches and vertical side  b  inches, a ball is launched from the middle of the table. After  s  > 0 seconds the ball returns to the point from which it was launched, after having made  m  bounces off the vertical sides and  n  bounces off the horizontal sides of the table. Find the launching angle  A  (measured from the horizontal), which will be between 0 and 90 degrees inclusive, and the initial velocity of the ball.

 

Assume that the collisions with a side are elastic (no energy loss), and thus the velocity component of the ball parallel to each side remains unchanged. Also, assume the ball has a radius of zero. Remember that, unlike pool tables, billiard tables have no pockets.

Input

Input consists of a sequence of lines, each containing five nonnegative integers separated by whitespace. The five numbers are:  a b s m , and  n , respectively. All numbers are positive integers not greater than 10000.

Input is terminated by a line containing five zeroes.

Output

For each input line except the last, output a line containing two real numbers (accurate to two decimal places) separated by a single space. The first number is the measure of the angle  A  in degrees and the second is the velocity of the ball measured in inches per second, according to the description above.

Sample Input

100 100 1 1 1
200 100 5 3 4
201 132 48 1900 156
0 0 0 0 0

Sample Output

45.00 141.42
33.69 144.22
3.09 7967.81

=============

2 思路

题目的关键在于两点。一是要明白反射的过程中角度的对称性,导致小球的轨迹中所有的线与水平方向的夹角都是一样的。 二是需要根据一这个性质,体会出a*m就是水平方向总路径长,b*n就是竖直方向总路径长,而小球总的路径长就是由总水平 长与总竖直长组成的三角形的斜边的长度。明白了这两点,代码就很容易写出来了。

另外,说句题外话。这题目想了好几个小时才体会出来这两点。不断地画图,做小例子,才体会到。可能是我智商太低, 那么久才想出来,不过由自己亲自想出来一个结论,并且得到验证,那种感觉实在太美妙了!

3 代码

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

#define PI acos(-1)

int main() {
  double a, b, s, m, n;
  double angle, velocity;

  while (scanf ("%lf%lf%lf%lf%lf", &a, &b, &s, &m, &n) != EOF) {
    if (a == 0 && b==0 && s==0 && m==0 && n==0) 
      break;
    angle = atan( (b*n)/(a*m) ) * 180 / PI;
    velocity = sqrt(b*n*b*n+a*m*a*m) / s;
    printf ("%.2lf %.2lf\n", angle, velocity);
  }

  return 0;
}


 
 

 

posted @ 2013-08-10 00:18  javawebsoa  Views(724)  Comments(0Edit  收藏  举报