1. 程式人生 > >LeetCode 858 鏡面反射

LeetCode 858 鏡面反射

題目

有一個特殊的正方形房間,每面牆上都有一面鏡子。除西南角以外,每個角落都放有一個接受器,編號為 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);
    }
};