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