码迷,mamicode.com
首页 > 其他好文 > 详细

BNU 斩(超级大水题)

时间:2015-04-07 21:42:14      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:算法   数学   

L. 斩

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format: %lld      Java class name: Main

在电影里面,我们经常可以看到武士们拔出刀,然后一刀斩下去,结果………………………………一张纸片被砍成了两半,囧…………

而在本题中,我们需要计算一下被斩下去较小的那一部分的面积。

我们假设纸片是矩形的,平行于坐标轴的,武士砍纸片的轨迹是一条直线。

Input

第一行一个整数N(2<=N<=350),表示数据组数。

接下来一行,每行7个整数,xl,yl,xr,yr,a,b,c ,表分别表示矩形左下角坐标(xl,yl),右上角坐标(xr,yr),以及轨迹方程ax+by+c=0。整数的绝对值均小于200。

Output

对于每一组数据,输出一个三位小数,表示砍后较小那部分的面积。数据保证这个面积大于0.001。

Sample Input

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

Sample Output

2.000
2.000

0.500 | |

思路:矩形有四条边 都延伸开---|----------|----------

| |

------|----------|------------

直线ax+by+c=0 与它有四个交点 、

找出四个交点的总哪两个是在矩形上的就可以算了(当时little yellow想出的方法和这不同 我听了1个多小时没懂 就不想写了)

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int t;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double S,s;
        double x1,y1,x2,y2,a,b,c;
        double Xy1,Xy2,x1Y,x2Y;
        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
        scanf("%lf%lf%lf",&a,&b,&c);
        Xy1=(c+b*y1)*1.0/-a;//下边点
        Xy2=(c+b*y2)*1.0/-a;//上边点
        x1Y=(c+a*x1)*1.0/-b;//左边点
        x2Y=(c+a*x2)*1.0/-b;//右边点
       // cout<<Xy1<<" "<<Xy2<<" "<<x1Y<<" "<<x2Y<<endl;

        bool f1,f2,f3,f4;//判断在那条边
        f1=(Xy1>=x1)&&(Xy1<=x2);
        f2=(Xy2>=x1)&&(Xy2<=x2);
        f3=(x1Y>=y1)&&(x1Y<=y2);
        f4=(x2Y>=y1)&&(x2Y<=y2);
        /*梯形面积*/
        if(f1&&f2)//下上平行边
        {
            s=(Xy1+Xy2-2*x1)*(y2-y1)/2.0;
        }
        else if(f3&&f4)//左右平行边
        {
            s=(x1Y+x2Y-2*y1)*(x2-x1)/2.0;/**/
        }/*三角形面积*/
        else if(f1&&f3)//下左相交边
        {
            s=(Xy1-x1)*(x1Y-y1)/2.0;
        }
        else if(f1&&f4)//下右相交边
        {
            s=(x2-Xy1)*(x2Y-y1)/2.0;
        }
        else if(f2&&f3)//上左相交边
        {
            s=(Xy2-x1)*(y2-x1Y)/2.0;
        }
        else if(f2&&f4)//上右相交边
        {
            s=(x2-Xy2)*(y2-x2Y)/2.0;
        }

        S=fabs(y2-y1)*(x2-x1);
        s=min(s,S-s);
        printf("%.3lf\n",s);
    }
}



BNU 斩(超级大水题)

标签:算法   数学   

原文地址:http://blog.csdn.net/u012349696/article/details/44925479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!