858. 镜面反射c++

有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 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;}
		}
	}

    }
};

猜你喜欢

转载自blog.csdn.net/HeXiQuan123/article/details/80794031