算法10.矩阵相交


题目描述

平面上有两个矩形A和B,其位置是任意的。编程求出其相交部分(即重叠部分)的面积。(0<ab<1000

image-20201002122545870

从标准输入读取两行以空格分隔的整数,格式如下:
Ax1 Ay1 Ax2 Ay2
Bx1 By1 Bx2 By2

其中(x1,y1)为矩形一个顶点座标,(x2,y2)为前一顶点的对角顶点座标。各座标值均为整数,取值在0至1000之间。

向标准输出打印一个整数,是两矩形相交部分的面积(可能为0)。在输出末尾要有一个回车符。

示例 1:

输入:  0 0 2 2
      1 1 3 4
输出: 1

解题思路

方法:普通分析

时间复杂度:$O(1)$

空间复杂度:$O(1)$

代码如下

#include <math.h>
#include <stdio.h>

int main(){
    int Ax1,Ay1,Ax2,Ay2,Bx1,By1,Bx2,By2,s;
    scanf("%d %d %d %d", &Ax1,&Ay1,&Ax2,&Ay2);
    scanf("%d %d %d %d", &Bx1,&By1,&Bx2,&By2);
    int xA_min,xB_min,xA_max,xB_max,yA_min,yB_min,yA_max,yB_max;

    // 确定A矩阵横纵坐标的最大最小值
    xA_min = Ax1<Ax2?Ax1:Ax2; xA_max = Ax1>Ax2?Ax1:Ax2; yA_min = Ay1<Ay2?Ay1:Ay2; yA_max = Ay1>Ay2?Ay1:Ay2;
    // 确定B矩阵横纵坐标的最大最小值
    xB_min = Bx1<Bx2?Bx1:Bx2; xB_max = Bx1>Bx2?Bx1:Bx2; yB_min = By1<By2?By1:By2; yB_max = By1>By2?By1:By2;
    // 排除相离相切情况
    if(xB_max<=xA_min || xA_max<=xB_min || yB_max<=yA_min || yA_max<=yB_min){
        printf("0\n");
    }
    // 分析相交情况的阴影面积
    else
    {
        int sx1,sx2,sy1,sy2;
        // 求出横坐标最小值中的最大值
        if(xA_min<=xB_min)
            sx1 = xB_min;
        else
            sx1 = xA_min;
        // 求出横坐标最大值中的最小值
        if(xA_max<=xB_max)
            sx2 = xA_max;
        else
            sx2 = xB_max;
        // 求出纵坐标最小值中的最大值
        if(yA_min<=yB_min)
            sy1 = yB_min;
        else
            sy1 = yA_min;
        // 求出纵坐标最大值中的最小值
        if(yA_max<=yB_max)
            sy2 = yA_max;
        else
            sy2 = yB_max;

        s = (sy2 - sy1) * (sx2 - sx1);
        printf("%d\n",s);
    }


}

解法分析

这道题的关键点是划分好哪些情况矩阵是相离(或者相切),哪些情况矩阵是相交。

那么,两个矩阵怎样摆放才使得阴影面积为0呢?

假设A矩阵固定,有以下四种情况会使得阴影面积为0:

  • B矩阵的最大横坐标还没有A矩阵最小横坐标
  • B矩阵的最小纵坐标还要比A矩阵最大纵坐标
  • B矩阵的最大纵坐标还没有A矩阵最小纵坐标
  • B矩阵的最小横坐标还要比A矩阵最大横坐标

相应的图示情况如下:

不相交情况图示

题目给了我们四个点的坐标,两两顶点对角,我们先把每个矩阵的最小横坐标xA_minxB_min,最大横坐标xA_maxxB_max,最小纵坐标yA_minyB_min,最大纵坐标yA_maxyB_max求出来,接着就可以进行相交判断:

if(xB_max<=xA_min || xA_max<=xB_min || yB_max<=yA_min || yA_max<=yB_min){
    printf("0\n");
}

解决了相离相切情况之后,接下来探讨相交情况:

相交情况图示

乍一看感觉好像很复杂,但是仔细分析之后,其实还是有规律可循的。

可以看到,每次相交之后,阴影矩形的长总是由xA_maxxB_max中的最小值xA_minxB_min中的最大值的距离构成;同样地,阴影矩形的宽总是由yA_maxyB_max中的最小值yA_minyB_min中的最大值的距离构成。

把阴影面积的长宽求出来之后,就可以将最后的面积求出。

解法注意点

  • 上述解法没有考虑当矩阵有角度的状况,如下图情况。(考虑了的话也太复杂了趴)

矩阵有角度情况


文章作者: ray
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ray !
评论
 上一篇
算法11.正则表达式匹配 算法11.正则表达式匹配
题目描述请实现一个函数用来匹配包含.和*的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,
2020-10-18
下一篇 
算法9.打印从1到最大的n位数 算法9.打印从1到最大的n位数
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 解题思路方法:DFS
2020-09-26
  目录