51 nod 1264 线段相交
2016-01-31 16:51
387 查看
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> const int P = 1e-8; using namespace std; int main(){ int T, x[5], y[5], i, j; double k[4], b[4]; double x1, y1; scanf("%d", &T); while(T--){ for(i = 1; i <= 4; ++i) scanf("%d%d", &x[i], &y[i]); for(i = 1, j = 1; i <= 4; i = i + 2, ++j){ k[j] = (y[i + 1] - y[i]) * 1.0 / (x[i + 1] - x[i]); } for(i = 1; i <= 2 ; ++i) b[i] = y[i + 1] - k[i] * x[i + 1]; if((int)b[1] != 0 && (int)b[2] != 0 && b[2] * k[1] == k[2] * b[1] && (int)k[1] * 100000 != (int)k[2] * 100000){ printf("No\n"); printf("%d %d", (int)k[1], (int)k[2]); continue; } else if((int)b[1] != 0 && (int)b[2] != 0 && b[2] * k[1] == k[2] * b[1] && (int)k[1] * 100000 == (int)k[2] * 100000){ if(x[2] < x[1]) swap(x[1], x[2]); if((x[3] >= x[1] && x[3] <= x[2]) || (x[4] >= x[1] && x[4] <= x[2])) printf("Yes\n"); else printf("No\n"); } else{ x1 = (b[2] - b[1]) * 1.0 / (k[1] - k[2]); y1 = k[1] * x1 + b[1]; if(x1 <= min(max(x[1], x[2]), max(x[3], x[4])) && x1 >= max(min(x[1], x[2]), min(x[3], x[4])) && y1 <= min(max(y[1], y[2]), max(y[3], y[4])) && y1 >= max(min(y[1], y[2]), min(y[3], y[4]))) printf("Yes\n"); else printf("No\n"); } } return 0; }
15ms 1876KB
我是先把四个点求出直线,判是否相交,相交求出交点,判断是否在两线段上。。。有点麻烦,也许还有更加简洁的方法。以后会更得,
相关文章推荐
- 三层登录——vb.net
- Jsp 内置对象
- 信息学奥林匹克竞赛-小鱼的游泳时间
- RxJava系列之一:观察者模式
- java的反射机制(含数组参数)
- CentOS 6.5 安装OSA监控精灵监控主机
- C++ enum
- POS机验证流程
- KinderEditor编辑器使用
- swift语言主流学习文档
- Android 设置主题实现点击波纹效果
- cocoapods 安装使用
- 高精度除法
- MyEclipse new 后面的菜单选项设置
- UML-实现图(构件图和部署图)
- 31. Next Permutation
- Use Node.js DDP Client on Arduino Yun to Access Meteor Server
- 深入理解Java内存模型(二)——重排序
- Graham算法构造凸包
- Material Design 相关资源