题目描述

你是能看到第二题的friends呢。

——laekov

Hja和Yjq在玩捉迷藏。Yjq躲了起来,Hja要找他。在他们玩游戏的房间里,只有一堵不透明的墙和一个双面的镜子。Hja和Yjq可以看作平面上坐标分别为(xv,yv)和(xp,yp)的点。墙是一条连接(xw1,yw1)和(xw2,yw2)的线段,镜子是一条连接(xm1,ym1)和(xm2,ym2)的线段。

如果视线和障碍物有公共点,那么我们认为视线会被阻挡,无法看见。如果视线和镜子有公共点,那么我们认为发生了反射。反射的过程遵循物理规律——入射角等于反射角,且反射光线与入射光线在镜子同侧。也就是说,想要看见对方,Hja和Yjq必须在镜子的同一侧,包括镜子所在直线上(参见样例1)。如果视线与镜子重合,那么不会发生反射,并且镜子不被当作障碍物(参见样例4)。

Hja很想知道他站在原地能否看见Yjq,帮助他解决这个问题。

输入输出格式

输入输出格式

输入格式:

第一行两个数xv,yv,表示Hja的坐标。

第二行两个数xp,yp表示Yjq的坐标。

第三行四个数xw1,yw1,xw2,yw2,分别表示墙的两个端点的坐标。

第四行四个数xm1,ym1,?xm2,ym2,分别表示镜子的两个端点的坐标。

输出格式:

如果Hja站在原地能看到Yjq,则输出"YES",否则输出"NO"。

输入输出样例

输入样例#1:

-1 3
1 3
0 2 0 4
0 0 0 1

输出样例#1:

NO

输入样例#2:

0 0
1 1
0 1 1 0
-100 -100 -101 -101

输出样例#2:

NO

输入样例#3:

0 0
1 1
0 1 1 0
-1 1 1 3

输出样例#3:

YES

输入样例#4:

0 0
10 0
100 100 101 101
1 0 3 0

输出样例#4:

YES

说明

对于 100%的数据, 所有坐标均为绝对值不超过 所有坐标均为绝对值不超过 104的整数。输入线段不会 的整数。输入线段不会 退化成点,且两条线段没有交。 退化成点,且两条线段没有交。 Hja和 Yjq的位置不同,且在任何一条线段 的位置不同,且在任何一条线段上

  1 /*
  2     叉积
  3 两个人如果能看见
  4 1、两人之间无墙无镜子(直接看两人连线与墙和镜子有无交点)
  5 2、两人之间有墙,但是能通过镜子看到(找两人视线在镜子所在直线的交点,判断交点是否在镜子上)
  6 */
  7
  8 #include<cstdio>
  9 #include<cstdlib>
 10 #include<cstring>
 11 #include<cmath>
 12 #include<algorithm>
 13 using namespace std;
 14 const double eps=1e-8;
 15 int sgn(double a)
 16 {
 17     if (fabs(a)<eps) return 0;
 18     else
 19     {
 20         if (a>0.0) return 1;
 21         else return -1;
 22     }
 23 }
 24 struct point
 25 {
 26     double x,y;
 27     point(){}
 28     point(double a,double b)
 29     {
 30         x=a;y=b;
 31     }
 32     void init()
 33     {
 34         scanf("%lf%lf",&x,&y);
 35     }
 36     point operator+(const point &a)const
 37     {
 38         point ans;
 39         ans.x=x+a.x;
 40         ans.y=y+a.y;
 41         return ans;
 42     }
 43     point operator-(const point &a)const
 44     {
 45         point ans;
 46         ans.x=x-a.x;
 47         ans.y=y-a.y;
 48         return ans;
 49     }
 50     point operator*(const double &a)const
 51     {
 52         point ans;
 53         ans.x=x*a;
 54         ans.y=y*a;
 55         return ans;
 56     }
 57     void print()
 58     {
 59         printf("%lf %lf\n",x,y);
 60     }
 61 }v,p,w1,w2,m1,m2;
 62 double cross(point a,point b)
 63 {
 64     return a.x*b.y-a.y*b.x;
 65 }
 66 double dot(point a,point b)
 67 {
 68     return a.x*b.x+a.y*b.y;
 69 }
 70 bool cross(point p1,point p2,point p3,point p4)
 71 {
 72     if(sgn(cross(p2-p1,p3-p1))*sgn(cross(p2-p1,p4-p1))==1) return false;
 73     if(sgn(cross(p4-p3,p1-p3))*sgn(cross(p4-p3,p2-p3))==1) return false;
 74     if(sgn(max(p1.x,p2.x)-min(p3.x,p4.x))==-1) return false;
 75     if(sgn(max(p1.y,p2.y)-min(p3.y,p4.y))==-1) return false;
 76     if(sgn(max(p3.x,p4.x)-min(p1.x,p2.x))==-1) return false;
 77     if(sgn(max(p3.y,p4.y)-min(p1.y,p2.y))==-1) return false;
 78     return true;
 79 }
 80 point getcross(point p1,point p2,point p3,point p4)
 81 {
 82     double a=p2.y-p1.y;
 83     double b=p1.x-p2.x;
 84     double c=-p1.x*p2.y+p1.y*p2.x;
 85     double d=p4.y-p3.y;
 86     double e=p3.x-p4.x;
 87     double f=-p3.x*p4.y+p3.y*p4.x;
 88     double x=(b*f-c*e)/(a*e-b*d);
 89     double y=(a*f-c*d)/(b*d-a*e);
 90     return point(x,y);
 91 }
 92 point calcfoot(point p1,point p2,point p3)
 93 {
 94     double ratio=dot(p1-p2,p3-p2)/dot(p3-p2,p3-p2);
 95     return p2+(p3-p2)*ratio;
 96 }
 97 bool check()
 98 {
 99     if(!cross(v,p,w1,w2))    //没有墙阻挡
100     {
101         if(!cross(v,p,m1,m2)) return true;    //也没有镜子阻挡
102         if(sgn(cross(m1-v,m2-v))==0&&sgn(cross(m1-p,m2-p)==0)) return true;    //与镜子平行
103     }
104     if(sgn(cross(m2-m1,v-m1))*sgn(cross(m2-m1,p-m1))==1)    //计算镜子所在直线上的折射点
105     {
106         point foot=calcfoot(p,m1,m2);
107         foot=foot*2.0-p;
108         if(cross(v,foot,m1,m2))        //折射点在镜子上
109         {
110             foot=getcross(v,foot,m1,m2);
111             if(!cross(v,foot,w1,w2)&&!cross(foot,p,w1,w2)) return true;    //判断两个人的目光是否会被墙打断
112         }
113     }
114     return false;
115 }
116 int main()
117 {
118     freopen("b.in","r",stdin);
119     freopen("b.out","w",stdout);
120     v.init();
121     p.init();
122     w1.init();
123     w2.init();
124     m1.init();
125     m2.init();
126     if (check()) printf("YES\n");
127     else printf("NO\n");
128     return 0;
129 }

View Code

转载于:https://www.cnblogs.com/lovewhy/p/7652894.html

2017.10.1 国庆清北 D1T2 两个逗比捉迷藏相关推荐

  1. 2017.10.3 国庆清北 D3T2 公交车

    题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...

  2. 2017.10.3北京清北综合强化班DAY3

    括号序列(bracket) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的 ...

  3. 2016国庆清北Day2T1

    PA [题目描述] 汉诺塔升级了:现在我们有N个圆盘和N个柱子,每个圆盘大小都不一样, 大的圆盘不能放在小的圆盘上面,N个柱子从左到右排成一排.每次你可以将一 个柱子上的最上面的圆盘移动到右边或者左边 ...

  4. 国庆清北刷题冲刺班 Day3 上午

    a [问题描述] 你是能看到第一题的 friends 呢. --hja 怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给 出了一种分单词的方法,何大爷认为两个单词是同一类的当这两个单词 ...

  5. 国庆清北刷题冲刺班 Day6 上午

    1. 角谷猜想 (kakutani.pas/c/cpp) (kakutani.in/out) 时间限制:1s/空间限制:256M [题目描述] 某个名字末尾是 654321 的小 A 同学是个大家眼中 ...

  6. 国庆清北 Day5 T3 holyshit

    一道神题 (holyshit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有n个数ai. 它想找两段互不相交的区间. 要求:不存在一个数在这两段区间 ...

  7. 2017国庆 济南清北学堂 8天乐

    Day 0 想吐槽济南的堵车 大约接近4点从莱芜走的,走高速一个多小时,5点左右就到了济南,但是因为济南的堵车,下班高峰期,用了两个多小时才到了我们的目的地.好不容易到宾馆登记了,mc还要我们开会,8 ...

  8. 为什么清北硕博扎推街道办毫不意外, 反会越来越多?

    近日,一张杭州余杭区招聘公示的截图引发网友关注.这份长长的公示名单里,清一色是来自清华.北大的毕业生,其中还包括一些街道办事处的岗位. 向上滑动阅览 例如: 运河街道办事处:录取的是北大新闻传播学硕士 ...

  9. 清华大学计算机综合基础真题,【盛世清北】2021清华大学912计算机专业基础综合考研真题-清华考...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [盛世清北]2021清华大学912计算机专业基础综合考研真题-清华考研辅导班 盛世清北分享: 清华大学912计算机专业基础综合考试真题,适用北京大学以下院 ...

最新文章

  1. require(os)
  2. 文本行中的基线(baseline)、底线、顶线、中线、行高、行距、行内框
  3. 从零开始的linux 第十一章
  4. 数据结构与算法--7.树的基础知识
  5. Bootstrap3 带列表组的面板
  6. 二叉树遍历算法之三:后序遍历
  7. 安卓手机使用Tasker实现应用级功能,屏幕翻译v9,翻译复制贴图
  8. ES:java.nio.file.AccessDeniedException: /opt/shan/es/config/elasticsearch.keystore
  9. 聚合数据iOS SDK 12306火车票查询订票演示示例
  10. 用计算机弹斗地主,单机斗地主
  11. mysql 主从1146_浅谈mysql主从同步及错误1146处理
  12. 若依框架不分离版本创建新模块(多模块版)
  13. MAC安装chromedriver碰到的问题
  14. ftl模板导出excel_freemarker导出定制excel
  15. 仓储管理之计价方法——毛利率法、零售价法【售价金额核算法】、计划成本法
  16. 帝国cms在任意位置调用指定id的栏目名称和链接
  17. 如何在网站中加入qq咨询
  18. 整理:图片文件管理工具类---ImageUtil
  19. 护卫神 主机大师 MySQL无法远程连接的解决方案
  20. 2021_6_20杂文

热门文章

  1. AtCoder Beginner Contest 246 A~E 题解 Bishop 2
  2. 国际理论计算机科学大会,顶级会议推荐:计算机科学理论会议5条
  3. python指数怎么表示_在Python中如何实现指数化?
  4. XCODE5中关闭ARC的方法
  5. 08弹性哈希供应加剧了自私挖矿攻击
  6. Java开发环境(jdk-17)
  7. 带你读AI论文:NDSS2020 UNICORN: Runtime Provenance-Based Detector
  8. python倒计时代码turtle,Python乌龟:开始倒计时得到斯图
  9. 联想服务器usb虚拟引入,联想ThinkCloud的OpenStack虚拟机的USB设备挂载
  10. C语言程序设计I—第九周教学