Content

一个矩形的顶点为 \((0,0)\),其对顶点为 \((x,y)\),现过 \((x,y)\) 作直线,分别交 \(x\) 轴和 \(y\) 轴于 \(A,B\) 两点,使得 \(\triangle OAB\) 为一个等腰直角三角形,求 \(A,B\) 点的坐标。(输出时 \(x\) 坐标小的先输出)

数据范围:\(-10^9\leqslant x,y\leqslant 10^9,x,y\neq 0\)。

Solution

这题是个数学题目,需要用到分类讨论。

这里先把草图给放上,方便大家理解——

当 \(x>0,y>0\),即 \((x,y)\) 在第一象限时,即如上图中 \(D\) 点所示。那么设我们过 \(D\) 点做的直线分别交 \(x,y\) 轴于 \(A_1,B_1\) 两点,并过 \(D\) 点做 \(DH_1\perp OA_1\)。则有 \(\angle DA_1O=45^\circ\)。所以 \(\triangle DH_1A_1\) 是一个等腰直角三角形,所以 \(H_1A_1=DH_1=|x|=x\)。同理,过 \(D\) 点做 \(DH_2\perp OB_1\),则有 \(\angle DB_1O=45^\circ\),所以 \(\triangle DH_2B_1\) 是一个等腰直角三角形,所以 \(B_1H_2=DH_2=|y|=y\)。所以 \(A_1\) 的横坐标为 \(OH_1+DH_1=x+y\),\(B_1\) 的纵坐标为 \(OH_2+B_1H_2=x+y\)。所以最终的结果就是 \(A_1(x+y,0),B_1(0,x+y)\)。

这里以第一象限的为例,其他的就请读者自己去推啦~

Code

#include <cstdio>
using namespace std; int main() {
int a, b;
scanf("%d%d", &a, &b);
if(a > 0 && b > 0) printf("0 %d %d 0", a + b, a + b);
else if(a < 0 && b > 0) printf("%d 0 0 %d", a - b, -a + b);
else if(a < 0 && b < 0) printf("%d 0 0 %d", a + b, a + b);
else if(a > 0 && b < 0) printf("0 %d %d 0", a - b, -a + b);
return 0;
}

最新文章

  1. jQuery2.x源码解析(设计篇)
  2. ASP.NET Core模块概述
  3. C++的深拷贝与浅拷贝
  4. JavaScript 使用反斜杠对代码行进行折行
  5. 第一个sprint心得及感想
  6. poj1182(食物链)续
  7. Android 加入一个动作按钮
  8. Java 8的五大开发技巧
  9. ros的相关link
  10. PHP之APC缓存详细介绍(转)
  11. win7 vs2008 激活
  12. makeBackronym
  13. JavaScript 调试常见报错以及修复方法
  14. DRBD脑裂解决方法
  15. Zxing中文乱码解决方法
  16. Robot Framework用法总结
  17. ios animation 动画效果实现
  18. MAC下的Intellij IDEA常用快捷键
  19. JS - Function 之 Arguments
  20. 35)django-验证码

热门文章

  1. 一文理解Java-class字节码文件
  2. NOIP2020 自爆记
  3. [省选联考 2021 A/B 卷] 宝石
  4. Atcoder Regular Contest 072 C - Alice in linear land(思维题)
  5. cp -拷贝文件出现错误
  6. 学习java的第十六天
  7. 巩固javaweb的第二十天
  8. Java交换数组元素
  9. VSCode+Maven+Hadoop开发环境搭建
  10. Vue中加载百度地图