858 镜面反射

题目描述:
有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2。
正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。
返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。

示例:
输入: p = 2, q = 1
输出: 2
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。
在这里插入图片描述
提示:
1 <= p <= 1000
0 <= q <= p

方法1:
主要思路:解题链接汇总
(1)光线要想最后到达指定的接收器,则必定在垂直方向上经过的距离是p的整数倍,且同时是q的整数倍,则先计算出p,q的最小公倍数;
(2)该最小公倍数是除以p,是光线经过垂直距离换算为p的个数,若该个数为偶数个,则说明最后回到了南边的,则一定是接收器0,否则是北边,则可能是1或2;
(3)再使用该最小公倍数除以q,获得光线在水平方向上折返的次数,若该次数是偶数个,则接收器2接受,否则是接受器1接受;

class Solution {
    
    
public:
    int mirrorReflection(int p, int q) {
    
    
        int len=gcd(p,q);//最大公约数
        len*=(p/len)*(q/len);//最小公倍数
        if(len/p%2==0){
    
    //是否是南边
            return 0;
        }
        if(len/q%2==0){
    
    //是否是西边
            return 2;
        }
        return 1;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_44171872/article/details/114028077