受该两块木板以形成槽的效果。Q槽可容纳雨水多,注意雨爆跌,思想是非常easy,分类讨论是有点差。

1.假定两条线段不相交或平行,然后再装0;

2.有一个平行x轴。连衣裙0。

3.若上面覆盖以下的,装0;

4.其他,叉积求面积。

直接上代码:

#include <iostream>
#include <cmath>
#include <stdio.h> using namespace std; const double eps=1e-8; struct point{
double x;
double y;
}; struct line{
point a;
point b;
}l1,l2; double ans; //求叉积
double xmult(point p0 ,point p1 ,point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int dblcmp(double n){
if(fabs(n)<eps) return 0;
return n>0?1:-1;
}
//推断是否相交。怎样相交
int judge(line l1 ,line l2){
double d1=dblcmp(max(l1.a.x,l1.b.x)-min(l2.a.x,l2.b.x));
double d2=dblcmp(max(l2.a.x,l2.b.x)-min(l1.a.x,l1.b.x));
double d3=dblcmp(max(l1.a.y,l1.b.y)-min(l2.a.y,l2.b.y));
double d4=dblcmp(max(l2.a.y,l2.b.y)-min(l1.a.y,l1.b.y));
double d5=dblcmp(xmult(l2.a,l1.a,l1.b));
double d6=dblcmp(xmult(l2.b,l1.a,l1.b));
double d7=dblcmp(xmult(l1.a,l2.a,l2.b));
double d8=dblcmp(xmult(l1.b,l2.a,l2.b));
if(d1>=0&&d2>=0&&d3>=0&&d4>=0){
if(d5*d6>0||d7*d8>0) return 0;//不相交
else if(d5==0&&d6==0) return 1;//共线相交
else if(d5==0||d6==0||d7==0||d8==0) return 2;//端点相交
else return 3;//规范相交
}
return 0;
} //求斜率
bool getslope(line l ,double &k){
double t=l.a.x-l.b.x;
if(t==0) return false;
k=(l.a.y-l.b.y)/t;
return true;
} //求线段交点
point getIntersect(line l1, line l2) {
point p;
double A1 = l1.b.y - l1.a.y;
double B1 = l1.a.x - l1.b.x;
double C1 = (l1.b.x - l1.a.x) * l1.a.y - (l1.b.y - l1.a.y) * l1.a.x;
double A2 = l2.b.y - l2.a.y;
double B2 = l2.a.x - l2.b.x;
double C2 = (l2.b.x - l2.a.x) * l2.a.y - (l2.b.y - l2.a.y) * l2.a.x;
p.x = (C2*B1 - C1*B2) / (A1*B2 - A2*B1);
p.y = (C1*A2 - C2*A1) / (A1*B2 - A2*B1);
if(p.x==-0) p.x=0;
return p;
} //求a,b两点中y坐标更大的点
point getbiggerY(point a ,point b){
point q;
if (dblcmp(a.y-b.y) > 0) {
q.x = a.x;
q.y = a.y;
} else {
q.x = b.x;
q.y = b.y;
}
return q;
} double getarea(point p ,point p1 ,point p2){
point q;
double a;
if(dblcmp(p1.y-p2.y)>=0) {
q.y = p2.y;
q.x = p.x+(p1.x-p.x)*(p2.y-p.y) / (p1.y-p.y); //求还有一点的坐标
a=fabs(xmult(p, p2, q)) / 2; //叉积求面积
}
else {
q.y = p1.y;
q.x = p.x+(p2.x-p.x)*(p1.y-p.y) / (p2.y-p.y);
a=fabs(xmult(p, p1, q)) / 2;
}
return a;
} int main()
{
int t;
cin>>t;
while(t--){
point p1 ,p2 ,p;
cin>>l1.a.x>>l1.a.y>>l1.b.x>>l1.b.y;
cin>>l2.a.x>>l2.a.y>>l2.b.x>>l2.b.y;
if(judge(l1,l2)<=1)//是否相交
ans=0;
else{
p1=getbiggerY(l1.a ,l1.b);
p2=getbiggerY(l2.a ,l2.b);
p=getIntersect(l1 ,l2);
if(!dblcmp(p.x-p1.x)&&!dblcmp(p.y-p1.y) || !dblcmp(p.x-p2.x)&&!dblcmp(p.x-p2.y))//开口方向
ans=0;
else{
double k1 ,k2;
bool f1 ,f2;
f1 = getslope(l1, k1);
f2 = getslope(l2, k2);
if (!dblcmp(k1) || !dblcmp(k2)) ans=0;
else if (f1 && f2) {//假设两条线都不与y轴平行
if (dblcmp(k1*k2) > 0) { //当两条线段的斜率符号同样时。
int d1 = dblcmp(k1-k2);
int d2 = dblcmp(k2);
if (d1>0&&d2>0&&dblcmp(p2.x-p1.x)*dblcmp(p2.x-p.x)<=0
|| d1<0&&d2>0&&dblcmp(p1.x-p2.x)*dblcmp(p1.x-p.x)<= 0
|| d1>0&&d2<0&&dblcmp(p1.x-p2.x)*dblcmp(p1.x-p.x)<= 0
|| d1<0&&d2<0&&dblcmp(p2.x-p1.x)*dblcmp(p2.x-p.x)<= 0)//覆盖情况
ans = 0;
else
ans=getarea(p,p1,p2);
}
else
ans=getarea(p,p1,p2);
}
else
ans=getarea(p,p1,p2);
}
}
printf ("%.2lf\n", ans);
}
return 0;
}

版权声明:本文博客原创文章。博客,未经同意,不得转载。

POJ 2826 An Easy Problem?! 好的标题的更多相关文章

  1. POJ 2826 An Easy Problem? 判断线段相交

    POJ 2826 An Easy Problem?! -- 思路来自kuangbin博客 下面三种情况比较特殊,特别是第三种 G++怎么交都是WA,同样的代码C++A了 #include <io ...

  2. POJ 2826 An Easy Problem?!

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7837   Accepted: 1145 ...

  3. POJ 2826 An Easy Problem?![线段]

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12970   Accepted: 199 ...

  4. POJ 2826 An Easy Problem?! --计算几何,叉积

    题意: 在墙上钉两块木板,问能装多少水.即两条线段所夹的中间开口向上的面积(到短板的水平线截止) 解法: 如图: 先看是否相交,不相交肯定不行,然后就要求出P与A,B / C,D中谁形成的向量是指向上 ...

  5. POJ 2826 An Easy Problem!(简单数论)

    Description Have you heard the fact "The base of every normal number system is 10" ? Of co ...

  6. 简单几何(线段相交) POJ 2826 An Easy Problem?!

    题目传送门 题意:两条线段看成两块木板,雨水从上方往下垂直落下,问能接受到的水的体积 分析:恶心的分类讨论题,考虑各种情况,尤其是入口被堵住的情况,我的方法是先判断最高的两个点是否在交点的同一侧,然后 ...

  7. POJ 2826 An Easy Problem?!(线段交点+简单计算)

    Description It's raining outside. Farmer Johnson's bull Ben wants some rain to water his flowers. Be ...

  8. POJ 1152 An Easy Problem! (取模运算性质)

    题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...

  9. [POJ] 2453 An Easy Problem [位运算]

    An Easy Problem   Description As we known, data stored in the computers is in binary form. The probl ...

随机推荐

  1. cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄的显示

    上篇文章我们有了坦克,但是没有手柄,无法控制坦克. 1.这篇我们编写虚拟手柄来控制坦克.头文件大致内容如下: #define RES_PADDLE_LEFT "paddle/left.png ...

  2. 函数指针&amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  3. JDK自己主动拆箱下,三目运算符的潜规则

    近期发现了一个非常诡异的NullPointerException,在以下这种方法抛出,一開始怎么都没想明确,dSrc即使为null,那直接赋值给distinct也没问题啊. private Doubl ...

  4. FxMaker用法

    第一步:选sceneFxMaker幕后,执行 第二步:执行界面,选中EffectParticle制作粒子特效 第三步:随便点中一个粒子特效.例如以下所看到的 第四步:点中右側的"Explos ...

  5. UVA 10574 - Counting Rectangles(枚举+计数)

    10574 - Counting Rectangles 题目链接 题意:给定一些点,求可以成几个边平行于坐标轴的矩形 思路:先把点按x排序,再按y排序.然后用O(n^2)的方法找出每条垂直x轴的边,保 ...

  6. 重操JS旧业第十弹:闭包

    闭包是js最难理解,也是最蛋疼的一个名词,仿佛只可意会不可言传一样,有人说闭包说白了就是函数嵌套,也有人说闭包就是函数能够访问函数外部的变量,而内部的外部访问不了: 貌似都非常有道理,其实仔细想来只不 ...

  7. 运行tomcat6w.exe ,提示 指定的服务未安装 unable to open the service 'tomcat66'

    错误:运行tomcat6w.exe ,提示 指定的服务未安装 unable to open the service 'tomcat6'(我用的是官网下载的解压版) 解决方法: 打开命令行提示符窗口=& ...

  8. Swift - 在界面上生成81个随机红,灰色圆点(SpriteKit游戏开发)

    下面是生成一个“围住神经猫”游戏的初始场景: 1,界面下方会生成9*9共81个圆点,同时圆点内部添加文本标签显示索引 2,默认圆点为灰色,每行随机取两个点变为红色 3,奇数行和偶数行有一定的错位,错位 ...

  9. 译文:前端性能的重要性 The Importance of Frontend Performance

    欢迎訪问我的主页.最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB 在我 ...

  10. GNOME界面简单使用

    GNOME界面 CentOS下的文件夹打开方式,默认是打开一个文件夹就重新的打开一个窗口,并不是在原有的文件夹中显示要打开文件夹的内容. 怎么修改: 打开任意一个文件夹. Edit --> pr ...