858. 镜面反射

有一个特殊的正方形房间,每面墙上都有一面镜子。除西南角以外,每个角落都放有一个接受器,编号为 0, 1,以及 2

正方形房间的墙壁长度为 p,一束激光从西南角射出,首先会与东墙相遇,入射点到接收器 0 的距离为 q 。

返回光线最先遇到的接收器的编号(保证光线最终会遇到一个接收器)。

 

示例:

输入: p = 2, q = 1
输出: 2
解释: 这条光线在第一次被反射回左边的墙时就遇到了接收器 2 。

 

不得不说leetcode700,800之后的题越来越玄乎了。
这种数学题愣是没想出来。
参考了一位博主的解法: https://blog.csdn.net/zjucor/article/details/80790193
感谢。
实际上这题是一个找规律的题。我们把光分为右上,右下,左上,左下四个方向。
因为“特殊规律代表一般规律”,设距离顶端(1,2出口这条线)为y。
用up,right两个bool值代表当前是否是右上,up取False是下,right取False是上。
每当y==0时才是进行判断的时候,观察可知(看图),1接受来自右上方向的,2接受左上方向的,其他应该是0接收。
 
 
当接触到顶端时,up会发生改变,而且每次碰撞right都会发生改变(可以用纸笔画画试试),要解决的是如果接触顶端导致y将变成负数如何解决。也是用笔试验一下,只要再加上p就能代表反弹。代码如下:
class Solution:
    def mirrorReflection(self, p, q):
        y=p
        up=right=True
        while True:
            y-=q
            if y==0:
                if up:
                    if right:
                        return 1
                    else:
                        return 2
                else:
                    return 0
            if y<0:
                y+=p
                up=not up
            right=not right

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值