LeetCode 858 鏡面反射

題目

有一個特殊的正方形房間,每面牆上都有一面鏡子。除西南角之外,每一個角落都放有一個接受器,編號爲 0, 1,以及 2。code

正方形房間的牆壁長度爲 p,一束激光從西南角射出,首先會與東牆相遇,入射點到接收器 0 的距離爲 q 。blog

返回光線最早遇到的接收器的編號(保證光線最終會遇到一個接收器)。io

思路

本題若單純依靠鏡面反射的思想很是複雜難以解決問題,必須將問題轉化。
1.咱們假設東西兩面牆無限向北拉長,將北牆暫時忽略,使得光線只有向上的反射。
2.當向上的縱距離第一次爲p的整數倍時,可認爲光線到達其中一個接收器。
3.經過觀察畫圖能夠發現,這個縱向距離是p和q的最小公倍數,設爲s。
4.如何去判斷光線遇到哪一個接收器?分兩步
a.首先肯定是光線到達南牆仍是北牆(判斷s/p奇偶);
b.如果南牆(s/p爲偶)直接返回接收器0;如果北牆(s/p爲奇)還需肯定是接受器1仍是2(判斷s/q奇偶);
class

代碼

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);
    }
};
相關文章
相關標籤/搜索