题目

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

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

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

思路

本题若单纯依靠镜面反射的思想非常复杂难以解决问题,必须将问题转化。

1.我们假设东西两面墙无限向北拉长,将北墙暂时忽略,使得光线只有向上的反射。

2.当向上的纵距离第一次为p的整数倍时,可认为光线到达其中一个接收器。

3.通过观察画图可以发现,这个纵向距离是p和q的最小公倍数,设为s。

4.如何去判断光线遇到哪个接收器?分两步

a.首先确定是光线到达南墙还是北墙(判断s/p奇偶);

b.若是南墙(s/p为偶)直接返回接收器0;若是北墙(s/p为奇)还需确定是接受器1还是2(判断s/q奇偶);

代码

class Solution {
public:
int mirrorReflection(int p, int q) {
int s=lcm(p,q);//最小公倍数等于纵向距离
if((s/p)%2==0){//若南北次数为偶,则为南墙,0
return 0;
}
else{//为奇北墙
if((s/q%2)==1)return 1;//若东西次数为奇,则东墙,1
else return 2;//为偶西墙,2
}
}
int gcd(int a, int b){//最大公约数
return a % b ? gcd(b, a % b) : b;
}
int lcm(int a, int b){//最小公倍数
return a * b / gcd(a, b);
}
};

最新文章

  1. SQL-从数据类型 varchar 转换为 bigint 时出错的解决方案
  2. JKS TO PEM
  3. node.js整理 06异步编程
  4. Linux:软件安装
  5. Javascript的封装
  6. iOS:使用Github托管自己本地的项目代码方式三(命令行方式: Terminal Line)
  7. angular Creating a Directive that Adds Event Listeners
  8. JavaScript学习记录总结(十)——几个重要的BOM对象
  9. DONET三层架构开发初步
  10. UVA11361 Investigating Div-Sum Property(数位dp)
  11. php笔记(二)PHP类和对象之Static静态关键字
  12. jQuery插件 -- 图片随页面滚动fixed
  13. JavaWeb 后端 <四> 之 Cookie HttpSession 学习笔记
  14. javascript集合的交,并,补,子集,长度,新增,删除,清空等操作
  15. 第六十八天 js轮播图
  16. MVC 添加JS,CSS等版本标签
  17. 理解微信小程序的生命周期和运行原理
  18. IT阅读——关于“业务”
  19. mint-ui之toast使用(messagebox,indicator同理)
  20. 【转】Asp.net实现URL重写

热门文章

  1. CSS 兼容问题
  2. CMD操纵Mysql命令大全
  3. 牛客练习赛4 A Laptop
  4. Python4_数据库相关操作
  5. win10 配置g++环境
  6. JLINK、ULINK和STlink仿真器详解
  7. 011.MFC_Slider
  8. 超简单!pytorch入门教程(四):准备图片数据集
  9. com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1680 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
  10. [工具] Git版本管理(四)(贡献开源代码、git配置、git免密、gitignore)