Leetcode 858. 鏡面反射 Python解法

題目描述

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

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

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

圖示:
圖示

解題思路:

光線很大可能會在這個正方形中反射多次才能到達一個接收器,如果寫代碼考慮反射問題,則是比較複雜的。那麼,反射問題該如何轉換呢?

可以轉換爲在無限個堆疊的相同正方形中傳播,說是無限個,其實光線傳播的最遠距離爲p和q的最小公倍數,那麼,最多經過的正方形個數就是pqlcm/ppq_{lcm} / p個,其中,pqlcmpq_{lcm}表示p和q的最小公倍數。

反射問題轉換之後,下一個問題就是,堆疊後的正方形,接收器的位置和原正方形中如何對應呢?

可以想象一下,或者自己畫示意圖看下(畫圖比較麻煩此處就省略了),由於反射是對稱的,那麼,如果在第二個正方形的右上角接收到光線,那麼對應於原正方形的0號接收器(即左下角);總結一下,奇數個正方形的的左上角和右上角依舊對應於原正方形的左上角和右上角,偶數個正方形的左上角和右上角則對應於原正方形的左下角和右下角。代碼如下:

Python代碼

class Solution:
    def mirrorReflection(self, p: int, q: int) -> int:
        # 求最小公倍數函數
        def lcm(x, y):
            if x%y == 0:
                return x
            elif y%x == 0:
                return y
            else:
                lcm = x * y
                while (x != y):
                    if x > y:
                        x = x - y
                    else:
                        y = y - x
                return int(lcm / x)
        pq_lcm = lcm(p, q)
        num_box = pq_lcm // p  #經過多少個box
        num_re = pq_lcm // q  #反射了幾次 確定終點在左還是右
        if num_box % 2 == 1:
            if num_re % 2 == 1:
                return 1
            else:
                return 2
        else:
            if num_re % 2 == 1:
                return 0
            else:
                return None
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章