2017.10.1 国庆清北 D1T2 两个逗比捉迷藏
题目描述
你是能看到第二题的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 3
1 3
0 2 0 4
0 0 0 1
NO
0 0
1 1
0 1 1 0
-100 -100 -101 -101
NO
0 0
1 1
0 1 1 0
-1 1 1 3
YES
0 0
10 0
100 100 101 101
1 0 3 0
YES
说明
对于 100%的数据, 所有坐标均为绝对值不超过 所有坐标均为绝对值不超过 104的整数。输入线段不会 的整数。输入线段不会 退化成点,且两条线段没有交。 退化成点,且两条线段没有交。 Hja和 Yjq的位置不同,且在任何一条线段 的位置不同,且在任何一条线段上
/*
叉积
两个人如果能看见
1、两人之间无墙无镜子(直接看两人连线与墙和镜子有无交点)
2、两人之间有墙,但是能通过镜子看到(找两人视线在镜子所在直线的交点,判断交点是否在镜子上)
*/ #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps=1e-;
int sgn(double a)
{
if (fabs(a)<eps) return ;
else
{
if (a>0.0) return ;
else return -;
}
}
struct point
{
double x,y;
point(){}
point(double a,double b)
{
x=a;y=b;
}
void init()
{
scanf("%lf%lf",&x,&y);
}
point operator+(const point &a)const
{
point ans;
ans.x=x+a.x;
ans.y=y+a.y;
return ans;
}
point operator-(const point &a)const
{
point ans;
ans.x=x-a.x;
ans.y=y-a.y;
return ans;
}
point operator*(const double &a)const
{
point ans;
ans.x=x*a;
ans.y=y*a;
return ans;
}
void print()
{
printf("%lf %lf\n",x,y);
}
}v,p,w1,w2,m1,m2;
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
double dot(point a,point b)
{
return a.x*b.x+a.y*b.y;
}
bool cross(point p1,point p2,point p3,point p4)
{
if(sgn(cross(p2-p1,p3-p1))*sgn(cross(p2-p1,p4-p1))==) return false;
if(sgn(cross(p4-p3,p1-p3))*sgn(cross(p4-p3,p2-p3))==) return false;
if(sgn(max(p1.x,p2.x)-min(p3.x,p4.x))==-) return false;
if(sgn(max(p1.y,p2.y)-min(p3.y,p4.y))==-) return false;
if(sgn(max(p3.x,p4.x)-min(p1.x,p2.x))==-) return false;
if(sgn(max(p3.y,p4.y)-min(p1.y,p2.y))==-) return false;
return true;
}
point getcross(point p1,point p2,point p3,point p4)
{
double a=p2.y-p1.y;
double b=p1.x-p2.x;
double c=-p1.x*p2.y+p1.y*p2.x;
double d=p4.y-p3.y;
double e=p3.x-p4.x;
double f=-p3.x*p4.y+p3.y*p4.x;
double x=(b*f-c*e)/(a*e-b*d);
double y=(a*f-c*d)/(b*d-a*e);
return point(x,y);
}
point calcfoot(point p1,point p2,point p3)
{
double ratio=dot(p1-p2,p3-p2)/dot(p3-p2,p3-p2);
return p2+(p3-p2)*ratio;
}
bool check()
{
if(!cross(v,p,w1,w2)) //没有墙阻挡
{
if(!cross(v,p,m1,m2)) return true; //也没有镜子阻挡
if(sgn(cross(m1-v,m2-v))==&&sgn(cross(m1-p,m2-p)==)) return true; //与镜子平行
}
if(sgn(cross(m2-m1,v-m1))*sgn(cross(m2-m1,p-m1))==) //计算镜子所在直线上的折射点
{
point foot=calcfoot(p,m1,m2);
foot=foot*2.0-p;
if(cross(v,foot,m1,m2)) //折射点在镜子上
{
foot=getcross(v,foot,m1,m2);
if(!cross(v,foot,w1,w2)&&!cross(foot,p,w1,w2)) return true; //判断两个人的目光是否会被墙打断
}
}
return false;
}
int main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
v.init();
p.init();
w1.init();
w2.init();
m1.init();
m2.init();
if (check()) printf("YES\n");
else printf("NO\n");
return ;
}
2017.10.1 国庆清北 D1T2 两个逗比捉迷藏的更多相关文章
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
- 2017.10.4 国庆清北 D4T2 正方形
题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...
- 2017.10.4 国庆清北 D4T1 财富
(其实这题是luogu P1901 发射站 原题,而且数据范围还比luogu小) 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在 ...
- 2017.10.7 国庆清北 D7T1 计数
题目描述 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. 输入输出格式 输入格式: 输入文件名为count.in. 第一行,包含两个整数:n ...
- 2017.10.5 国庆清北 D5T1 拼不出的数
题目描述 3 个元素的集合{5,1,2}的所有子集的和分别是0,1,2,3,5,6,7,8.发现最小的不能由该集合子集拼出的数字是4. 现在给你一个n个元素的集合,问你最小的不能由该集合子集拼出的数字 ...
- 2017.10.6 国庆清北 D6T3 字符串
题目描述 如果把一个字符串从头到尾翻转后和原字符串相等,我们称之为回文串,比如“aabaa”.“())(”.“2017102”. 如果一个字符串存在两个出现过的字母出现的次数相等,我们称之为好 的字符 ...
- 2017.10.6 国庆清北 D6T2 同余方程组
题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...
- 2017.10.6 国庆清北 D6T1 排序
题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. 比如a 序列 ...
- 2017.10.3 国庆清北 D3T3 解迷游戏
题目描述 LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画. 幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它. 老板有一个n*m的矩阵,他想 ...
随机推荐
- jmeter_图形监控
图形监控插件下载: http://jmeter-plugins.org/downloads/all/ 下载: JMeterPlugins-Standard-1.4.0 ServerAgent-2. ...
- application.yml报错:a global security auto-configuration is now provided
报错原因: Spring Boot 1.5升级到2.0改动 security开头的配置及management.security均已过期 Actuator 配置属性变化 Endpoint变化 参考来源: ...
- 保研经验帖----江西师范大学 to 华中科技大学
呼,距离拿到华科cs的offer也有一段时间,有好几次准备动手写这篇经验帖,但就是理不清自己想表达什么,今早起来状态还不错,洗漱的时候思路居然通透了,哈哈哈~ 一.基本情况 先简单介绍笔者的一些基本情 ...
- IDEA使用@Data注解,类调用get、set方法标红的解决办法
1.在setting中,下载lombok插件,安装完成后重启idea
- sql 作业创建
转载:https://jingyan.baidu.com/article/adc81513be3423f722bf7351.html
- Java调用WebService方法总结(7)--CXF调用WebService
CXF = Celtix + XFire,继承了Celtix和XFire两大开源项目的精华,是一个开源的,全功能的,容易使用的WebService框架.文中所使用到的软件版本:Java 1.8.0_1 ...
- Manjaro 安装笔记
双系统基本知识 [折腾日记]win10 ,ubuntu双系统安装避坑指南 Windows 下安装 Ubuntu 双系统(更新) rEFInd 总结注意点: 制作U盘启动盘一开始使用的是 Ulrstro ...
- XML 约束
XML约束 一.约束 约束:规定 xml 文档的书写规则 要求: 1.能够在 xml 中引入约束文档 2.能够简单的读懂约束文档 分类: 1.DTD:一种简单的约束技术(后缀.dtd) 2.Schem ...
- 忽略警告@SuppressWarnings的用法
@SuppressWarnings注解用法 @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 我们可以在方法上加上@S ...
- 关于近期使用webpack所引发的思考
近期,(使其也挺长时间了).使用了一段时间的webpack. 但是在使用期间个人感觉并不想网上说的那样好,个人对webpack的评价并不是很高,甚至有点反感使用webpack. 个人感觉使用webpa ...