LeetCode 858 鏡面反射
阿新 • • 發佈:2020-01-29
題目
有一個特殊的正方形房間,每面牆上都有一面鏡子。除西南角以外,每個角落都放有一個接受器,編號為 0, 1,以及 2。
正方形房間的牆壁長度為 p,一束鐳射從西南角射出,首先會與東牆相遇,入射點到接收器 0 的距離為 q 。
返回光線最先遇到的接收器的編號(保證光線最終會遇到一個接收器)。
思路
本題若單純依靠鏡面反射的思想非常複雜難以解決問題,必須將問題轉化。
1.我們假設東西兩面牆無限向北拉長,將北牆暫時忽略,使得光線只有向上的反射。
2.當向上的縱距離第一次為p的整數倍時,可認為光線到達其中一個接收器。
3.通過觀察畫圖可以發現,這個縱向距離是p和q的最小公倍數,設為s。
4.如何去判斷光線遇到哪個接收器?分兩步
a.首先確定是光線到達南牆還是北牆(判斷s/p奇偶);
b.若是南牆(s/p為偶)直接返回接收器0;若是北牆(s/p為奇)還需確定是接受器1還是2(判斷s/q奇偶);
程式碼
class Solution {
public:
int mirrorReflection(int p, int q) {
int s=lcm(p,q);//最小公倍數等於縱向距離
if((s/p)%2==0){//若南北次數為偶,則為南牆,0
return 0;
}
else{//為奇北牆
if((s/q%2)==1)return 1;//若東西次數為奇,則東牆,1
else return 2;//為偶西牆,2
}
}
int gcd(int a, int b){//最大公約數
return a % b ? gcd(b, a % b) : b;
}
int lcm(int a, int b){//最小公倍數
return a * b / gcd(a, b);
}
};