程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVa 10387- Billiard

UVa 10387- Billiard

編輯:C++入門知識

UVa 10387- Billiard
Table of Contents
1 題目
2 思路
3 代碼
4 參考
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;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved