UVa 10387- Billiard
1 題目
=============php
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.ide
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.post
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
=============spa
2 思路
題目的關鍵在於兩點。一是要明白反射的過程當中角度的對稱性,致使小球的軌跡中全部的線與水平方向的夾角都是同樣的。 二是須要根據一這個性質,體會出a*m就是水平方向總路徑長,b*n就是豎直方向總路徑長,而小球總的路徑長就是由總水平 長與總豎直長組成的三角形的斜邊的長度。明白了這兩點,代碼就很容易寫出來了。code
另外,說句題外話。這題目想了好幾個小時才體會出來這兩點。不斷地畫圖,作小例子,才體會到。多是我智商過低, 那麼久纔想出來,不過由本身親自想出來一個結論,而且獲得驗證,那種感受實在太美妙了!component
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; }