d170 - 飛蛾撲火(一)
題目描述
題目描述了飛蛾楓火尋找父母的故事。給定飛蛾的起點、目的地和一個有火的樹的位置,判斷飛蛾是否會碰到樹而被火燙到。如果會碰到,輸出 "該死的東西!竟敢想讓我死!",否則輸出 "父親大人!母親大人!我快到了!"。
解題思路
題目要求判斷三點是否共線,以及飛蛾是否會在到達目的地之前碰到樹。程式碼首先計算了飛蛾起點到樹的距離 fl 和起點到目的地的距離 hl。然後,程式碼處理了幾種特殊情況:
- 如果起點和樹的 x 座標相同,則檢查樹是否在飛蛾和目的地的垂直線上,並且距離比到目的地的距離近。
- 如果樹和起點的 x 座標相同,則輸出 "父親大人!母親大人!我快到了!"。
- 否則,計算起點和目的地的斜率
m,並檢查樹是否在該直線上,並且距離比到目的地的距離近。
程式碼的核心邏輯是判斷三點是否共線,以及飛蛾是否會在到達目的地之前碰到樹。
複雜度分析
- 時間複雜度: O(1)
- 空間複雜度: O(1)
程式碼
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double x1,y1,x2,y2,x3,y3;
cin >> x1;
while(cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3){
double fl= sqrt((y3-y1)*(y3-y1)+(x3-x1)*(x3-x1));
double hl= sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1));
if(x2-x1==0){
if(x3-x1==0&&fl<hl)
cout << "該死的東西!竟敢想讓我死!\n";
else
cout << "父親大人!母親大人!我快到了!\n";
}
else if(x3-x1==0&&x2-x1!=0){
cout << "父親大人!母親大人!我快到了!\n";
}
else{
double m=(y2-y1)/(x2-x1);
if((y3-y2)/(x3-x2)==m&&fl<hl)
cout << "該死的東西!竟敢想讓我死!\n";
else
cout << "父親大人!母親大人!我快到了!\n";
}
}
}