杭电2056 解题思路

这道题目翻译过来就是:

给定两个矩形和每个矩形对角线上两个点的坐标,你必须计算两个矩形的相交部分的面积,矩形的长与宽分别与X轴Y轴平行 。


解题:首先,由分析我们可以知道,给定的矩形对角线可能有俩种,一种是主对角线,一种是副对角线,这里是有些差别的,另外,给定的俩个矩形可能没有重叠的部分,除了这种情况外,其余的情况都是有相交部分的。

下面分析几种情况找到解题方法


第一种情况:

TIM图片20180115192426.png

假设A1的坐标为(x1,y1)B1的坐标为(x2,y2)A2的坐标为(x3,y3)B2的坐标为(x4,y4)。

要求阴影部分的面积:


分析易得:

相交面积为:四顶点中y值最大所在矩形对应的边减去(该y值减去另一矩形俩对角顶点中较大y值)乘以四顶点中x值最大所在矩形减去(该x值减去另一矩形俩对角顶点中较大x值)。

即 S(相交)=A2所在的矩形的边长-(x4-x2)*A2所在矩形的边长-(y3-y2)


第二种情况

图片.png

如果按照第一种情况处理,我们明显可以发现结果不对,只要我们仔细一想,就能发现我们少减了一些东西,四顶点中y值最大所在矩形对应的边减去(该y值减去另一矩形俩对角顶点中较大y值)另外,(当另一矩形中的较小的y坐标减去该矩形的较小y坐标值为正时,我们应该将这部分的长度也减去)乘以四顶点中x值最大所在矩形减去(该x值减去另一矩形俩对角顶点中较大x值)(当另一矩形中的较小的坐标减去该矩形的较小x坐标值为正时,我们应该将这部分的长度也减去)。


对于是否有相交,我们只需要判断四顶点中y值最大所在矩形对应的边减去(该y值减去另一矩形俩对角顶点中较大y值)或者四顶点中x值最大所在矩形减去(该x值减去另一矩形俩对角顶点中较大x值)是否大于0,如果不是,那么这俩个矩形就没有交点。


最后,贴上完整代码:


import java.util.Scanner;
public class Main
{
    public static void main(String[]args)
    {
        Scanner scanner=new Scanner(System.in);
        double x1,y1,x2,y2,x3,y3,x4,y4;
        double x01,y01,x02,y02;//用来保存矩形对角线中大的x坐标和大的y坐标
        double x001,y001,x002,y002;//用来保存矩形对角线中小的x坐标和小的y坐标
        double xx01,yy01;//用来保存俩个矩形中更大的x坐标和大的y坐标
        double len1,wid1,len2,wid2;//用来保存矩形的长度和宽度
        double cx,cy;
        while (scanner.hasNext())
        {
            x1=scanner.nextDouble();
            y1=scanner.nextDouble();
            x2=scanner.nextDouble();
            y2=scanner.nextDouble();
            x3=scanner.nextDouble();
            y3=scanner.nextDouble();
            x4=scanner.nextDouble();
            y4=scanner.nextDouble();
            x01=x1>x2?x1:x2;
            y01=y1>y2?y1:y2;
            x02=x3>x4?x3:x4;
            y02=y3>y4?y3:y4;
            x001=x1>x2?x2:x1;
            y001=y1>y2?y2:y1;
            x002=x3>x4?x4:x3;
            y002=y3>y4?y4:y3;
            len1=Math.abs(x1-x2);
            wid1=Math.abs(y1-y2);
            len2=Math.abs(x3-x4);
            wid2=Math.abs(y3-y4);
            xx01=x01>x02?x01:x02;
            yy01=y01>y02?y01:y02;
            if(xx01==x01&&yy01==y01)
            {
                cx=len1-(xx01-x02);
                cy=wid1-(yy01-y02);
                if(cx<=0||cy<=0){
                    System.out.println("0.00");//没有交点,直接输出结果。
                }else {

                    if(x002-x001>0)
                        cx=cx-(x002-x001);
                    if(y002-y001>0)
                        cy=cy-(y002-y001);
                    System.out.printf("%.2f",(cx*cy));
                    System.out.println();
                }
            }
            if(xx01==x01&&yy01==y02)
            {
                cx=len1-(xx01-x02);
                cy=wid2-(yy01-y01);
                if(cx<=0||cy<=0){
                    System.out.println("0.00");
                }else {
                    if(x002-x001>0)
                        cx=cx-(x002-x001);
                    if(y001-y002>0)
                        cy=cy-(y001-y002);
                    System.out.printf("%.2f",(cx*cy));
                    System.out.println();

                }

            }
            if(xx01==x02&&yy01==y01)
            {
                cx=len2-(xx01-x01);
                cy=wid1-(yy01-y02);
                if(cx<=0||cy<=0){
                    System.out.println("0.00");
                }else {
                    if(x001-x002>0)
                        cx=cx-(x001-x002);
                    if(y002-y001>0)
                        cy=cy-(y002-y001);
                    System.out.printf("%.2f",(cx*cy));
                    System.out.println();

                }

            }
            if(xx01==x02&&yy01==y02)
            {
                cx=len2-(xx01-x01);
                cy=wid2-(yy01-y01);
                if(cx<=0||cy<=0){
                    System.out.println("0.00");
                }else {
                    if(x001-x002>0)
                        cx=cx-(x001-x002);
                    if(y001-y002>0)
                        cy=cy-(y001-y002);
                    System.out.printf("%.2f",(cx*cy));
                    System.out.println();

                }

            }

        }
    }
}


关于输出格式,一直不懂为什么printf中加入\n就会PE,而多加一句System.out.println();就可以AC。




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuhuimingc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值