首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

UVA 10387 Billiard 彈球問題幾何解法與代碼實現

     編輯:關於C

題目重述

長方形桌面中心發射一球,已知長寬 a, b、運動時間 s、水平/垂直方向碰壁次數 m, n,求初速度與發射角度。

幾何洞察:鏡像展開法

  • 球在長方形內反射等效於在無限鏡像延展的平面上做勻速直線運動
  • 水平總位移 ta = a * m,垂直總位移 tb = b * n
  • 實際路徑長度 tc = sqrt(ta² + tb²)
  • 發射角度 θ = atan(tb / ta),初速度 v = tc / s

AC 代碼(C++,GNU++17 通過)

#include <cstdio>
#include <cmath>
using namespace std;

const double PI = atan(1.0) * 4.0;

int main() {
    double a, b, s, m, n;
    while (scanf("%lf%lf%lf%lf%lf", &a, &b, &s, &m, &n) == 5) {
        if (a == 0 && b == 0 && s == 0 && m == 0 && n == 0) break;
        double ta = a * m;
        double tb = b * n;
        double tc = sqrt(ta * ta + tb * tb);
        printf("%.2lf %.2lf\n", atan(tb / ta) * 180 / PI, tc / s);
    }
    return 0;
}

關鍵點提示

  • 輸入以五個 0 結束,非單行測資
  • 角度轉度數:rad * 180 / PI
  • 輸出保留兩位小數 %.2lf
  • 幾何模型避免了逐步模擬反射,時間複雜度 O(1)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved