2023年蓝桥杯省赛——矩形面积总和

目录

题目链接: 1.矩形总面积 - 蓝桥云课 (lanqiao.cn)

思路

暴力

数学杯思路

数学逻辑 

难点之重合区域

代码实现

总结


题目链接: 1.矩形总面积 - 蓝桥云课 (lanqiao.cn)

思路

暴力

        开幕雷击,我直接开始暴力,但是我暴力到一半,发现暴力的方法如果要把全部的矩形分布情况都包含进去的话,真的太多了,太长了,太臭了。随即我意识到蓝桥杯其实是数学杯,wori,我来看看。

        下面是的暴力到一半的代码,我知道暴力不出来了,就直接先截断很多情况没有考虑,直接赶紧搞定就输出了。而且这里的面积处理虽然是对的但是处理的太复杂了。 

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 接收参数
        // 矩形 1 左下角 ↙
        long zx1_x = scanner.nextInt();
        long zx1_y = scanner.nextInt();
        // 矩形 1 右上角 ↗
        long ys1_x = scanner.nextInt();
        long ys1_y = scanner.nextInt();
        // 矩形 1 左上角 ↖
        long zs1_x = zx1_x;
        long zs1_y = ys1_y;
        // 矩形 1 右下角 ↘
        long yx1_x = ys1_x;
        long yx1_y = zx1_y;

        // 矩形 2 左下角 ↙
        long zx2_x = scanner.nextInt();
        long zx2_y = scanner.nextInt();
        // 矩形 2 右上角 ↗
        long ys2_x = scanner.nextInt();
        long ys2_y = scanner.nextInt();
        // 矩形 2 左上角 ↖
        long zs2_x = zx2_x;
        long zs2_y = ys2_y;
        // 矩形 2 右下角 ↘
        long yx2_x = ys2_x;
        long yx2_y = zx2_y;

        
        // 判断两个矩形摆放的位置的类型
        long s = 0;
        if ((zx1_x >= zx2_x && zx1_y >= zx2_y)||(zx1_x <= zx2_x && zx1_y <= zx2_y)) {
            // 是↗ or ↙摆的
            if (zx1_x < zx2_x) {
                // ↗
                long sAll = (ys2_y - yx1_y)*(ys2_x - yx1_x);
                long s1 = (yx2_y - yx1_y)*(yx2_x - yx1_x);
                long s2 = (zs2_y - zs1_y)*(zs2_x - zs1_x);
                s = sAll - s1 - s2;
            }else if (zx1_x > zx2_x) {
                // ↙
                long sAll = (ys1_y - yx2_y)*(ys1_x - yx2_x);
                long s1 = (yx1_y - yx2_y)*(yx1_x - yx2_x);
                long s2 = (zs1_y - zs2_y)*(zs1_x - zs2_x);
                s = sAll - s1 - s2;
            }
        }else {
            // 是↖ or ↘摆的
            if (zx1_x < zx2_x) {
                // ↘
                long sAll = Math.abs((zs1_y - yx2_y)*(zs1_x - yx2_x));
                long s1 = Math.abs((zx1_y - zx2_y)*(zx1_x - zx2_x));
                long s2 = Math.abs((ys1_y - ys2_y)*(ys1_x - ys2_x));
                s = sAll - s1 - s2;
            }else if (zx1_x > zx2_x) {
                // ↖
                long sAll = Math.abs((zs2_y - yx1_y)*(zs2_x - yx1_x));
                long s1 = Math.abs((zx2_y - zx1_y)*(zx2_x - zx1_x));
                long s2 = Math.abs((ys2_y - ys1_y)*(ys2_x - ys1_x));
                s = sAll - s1 - s2;
            }
        }
        System.out.println(s);
    }
}

直接裂开,头脑简单,四肢发达

数学杯思路

蓝桥杯,什么蓝桥杯,这个就是数学杯!!!!!!!!!!!

写蓝桥杯的题,写别慌写,先研究他的数学逻辑!!!!!!!!!!!!!!!

数学逻辑 

在研究这道题之前,我们先研究这道题的数学逻辑。

如果我问你:

        现在我有两个矩形,可能重合可能不重合,也可能部分相交,我会给你这两个矩形的左下角和右上角的坐标,如果我想用java代码求得这两个矩形覆盖的面积,重合部分只计算一次,你怎么做。

你可以答:

  1. 计算两个矩形各自的面积。首先,我们需要找到每个矩形的宽度和高度,这可以通过简单地将右上角的坐标减去左下角的坐标得出。然后,我们通过将宽度和高度相乘得出每个矩形的面积。

  2. 找出重叠区域的坐标。首先,我们需要找到重叠区域的左下角和右上角的坐标左下角坐标是两个矩阵左下角点的最大坐标右上角坐标是两个矩阵右上角点的最小坐标

  3. 计算重叠区域的面积。使用和第一步相同的方法,得出重叠区域的面积。

  4. 最后,我们通过将第一步得到的两个矩形的面积相加,然后减去第三步得到的重叠区域的面积,就可以得到两个矩形覆盖的总面积。因为重叠区域被计算了两次,所以我们需要将它从总面积中减去。

难点之重合区域

再问这个重叠区域的坐标是怎么找到的?

答:

  1. 左下角的坐标是这样找的:对于x坐标,我们比较两个矩形左下角的x坐标,取较大的那个;对于y坐标,我们比较两个矩形左下角的y坐标,也是取较大的那个。于是,我们得到的新的坐标点就是重叠区域左下角的坐标。

  2. 右上角的坐标是这样找的:对于x坐标,我们比较两个矩形右上角的x坐标,取较小的那个;对于y坐标,我们比较两个矩形右上角的y坐标,取较小的那个。得到的新的坐标点就是重叠区域右上角的坐标。

  3. 如果这样得到的重叠区域的左下角坐标比右上角对应的坐标大(也就是形成了一个“矩形”宽度或者高度小于0),我们就认为两个矩形没有重叠区域,此时可以直接将重叠区域的面积设为0。

这个逻辑大家稍微画一个图来理解一下就可以很清楚的懂了。

代码实现



import java.util.Scanner;

// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		// 接收参数
		// 矩形 1 左下角 ↙
		long zx1_x = scanner.nextInt();
		long zx1_y = scanner.nextInt();
		// 矩形 1 右上角 ↗
		long ys1_x = scanner.nextInt();
		long ys1_y = scanner.nextInt();

		// 矩形 2 左下角 ↙
		long zx2_x = scanner.nextInt();
		long zx2_y = scanner.nextInt();
		// 矩形 2 右上角 ↗
		long ys2_x = scanner.nextInt();
		long ys2_y = scanner.nextInt();

		
		// 分别计算两个矩形的面积
		long s1 = (ys1_y - zx1_y)*(ys1_x - zx1_x);
		long s2 = (ys2_y - zx2_y)*(ys2_x - zx2_x);
		
		// 计算重合部分的面积
		// 重合部分的左下角是大的那一个 x1 y1
		long x1 = Math.max(zx1_x, zx2_x);
		long y1 = Math.max(zx1_y, zx2_y);
		// 重合部分的右上角是小的那一个 x2 y2
		long x2 = Math.min(ys1_x, ys2_x);
		long y2 = Math.min(ys1_y, ys2_y);
		
		
		if (y2 - y1 < 0 || x2 - x1 < 0) {
			// 判断是否有重合的部分,这种情况就是没有重合的部分
			System.out.println(s1 + s2);
		}else {
			// 有重合的部分
			long sc = (y2 - y1)*(x2 - x1);
			System.out.println(s1 + s2 - sc);
		}	
	}
}

总结

这不是蓝桥杯,这是

数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯数学杯

记住了兄弟们,我也是服啦

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WenJGo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值