858. 鏡面反射

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

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

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

 

示例:

輸入: p = 2, q = 1
輸出: 2
解釋: 這條光線在第一次被反射回左邊的牆時就遇到了接收器 2 。

 

提示:

  1. 1 <= p <= 1000

 

  1. 0 <= q <= p

思路:既然保證可以回到某個點(其實只要是int值的pq,都一定會回到0 1 2某個點,可證明),找回到0/1/2的分佈滿足什麼規律。0就是碰牆第奇數次,水平行走距離爲q的奇數唄且是p的偶數倍,1是碰牆第奇數次,q的奇數倍,p的奇數倍,2是碰牆第偶數次且是p的奇數倍。水平行走距離是反彈第i次的q倍,用i模2且iq模p/2p得解。

class Solution {
public:
    int mirrorReflection(int p, int q) {
        int i;//反彈次數
	for(i=1;;i++)
	{
		if(i%2==0)
		{
			if((i*q)%(2*p)==p) {return 2;}
		}
		else
		{
			if((i*q)%(2*p)==p) {return 1;}
			else if((i*q)%(2*p)==0) {return 0;}
		}
	}

    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章