hihoCoder #1040 (判断是否为矩形)
2016-05-09 19:38
295 查看
题目大意:给四条线段,问能否构成一个矩形?
题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直。
代码如下:
题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直。
代码如下:
# include<iostream> # include<cstdio> # include<cmath> # include<set> # include<cstring> # include<algorithm> using namespace std; # define LL long long const double inf=1e20; const double eps=1e-20; struct Edge { LL x,y; double k; }; Edge e[4]; set<LL>s; double getK(int i) { if(e[i].x==0) return inf; return (double)e[i].y/(double)e[i].x; } bool ok(int i,int j) { return e[i].x*e[j].x+e[i].y*e[j].y==0ll; } bool judge() { if(s.size()!=4) return false; int cnt1=0,cnt2=0; for(int i=1;i<4;++i){ if(ok(0,i)) ++cnt1; if(e[0].k==e[i].k) ++cnt2; } return cnt1==2&&cnt2==1; } int main() { int T; scanf("%d",&T); while(T--) { LL a,b,c,d; s.clear(); for(int i=0;i<4;++i){ scanf("%lld%lld%lld%lld",&a,&b,&c,&d); s.insert(a*100000ll+b); s.insert(c*100000ll+d); e[i].x=c-a; e[i].y=d-b; e[i].k=getK(i); } if(judge()) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- 安卓中的消息循环机制Handler及Looper详解
- 面向对象(上)知识点
- "open failed: EACCES (Permission denied)"权限已加,写入sd卡仍报错的解决办法
- 使用Docker容器不能忽略的10件事
- asynchttpclient post方法使用
- 安卓中的消息循环机制Handler及Looper详解
- 【Javascript】HTML DOM知识点总结
- css实现自适应屏幕高度
- Android音频系统之音频框架
- 高斯消元模板
- <OJ_Sicily>Maze
- STL 源码剖析读书笔记二:迭代器与traits
- hdu4135 Co-prime(容斥)
- 连接部分真机不能打印Logcat
- 如果有人问你数据库的原理,叫他看这篇文章
- Android 图片加载类一 ImageLoader
- 完整全面的Java资源库(包括构建、操作、代码分析、编译)
- GetPost请求网络数据 功能很强大
- 常用linux命令30个
- 如何让iOS启动屏停留更久