# Geometry# Conditional Logic# Math

d170 - 飛蛾撲火(一)

🔗 前往 ZeroJudge 原題

題目描述

題目描述了飛蛾楓火尋找父母的故事。給定飛蛾的起點、目的地和一個有火的樹的位置,判斷飛蛾是否會碰到樹而被火燙到。如果會碰到,輸出 "該死的東西!竟敢想讓我死!",否則輸出 "父親大人!母親大人!我快到了!"。

解題思路

題目要求判斷三點是否共線,以及飛蛾是否會在到達目的地之前碰到樹。程式碼首先計算了飛蛾起點到樹的距離 fl 和起點到目的地的距離 hl。然後,程式碼處理了幾種特殊情況:

  1. 如果起點和樹的 x 座標相同,則檢查樹是否在飛蛾和目的地的垂直線上,並且距離比到目的地的距離近。
  2. 如果樹和起點的 x 座標相同,則輸出 "父親大人!母親大人!我快到了!"。
  3. 否則,計算起點和目的地的斜率 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";
		}
	} 
}

Discussion