问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
思路:把矩阵看作二维数组。首先遍历第一个二维数组,把遍历过的下标存到一个列表中;然后遍历第二个数组,计算和第一个二维数组重复的下标的个数,即为所求。
Python代码:
a,b,c,d=map(int,input().split()) # 矩形1
x,y,z,r=map(int,input().split()) # 矩形2
minc1,minr1=min(a,c),min(b,d) # 矩阵1的最小横坐标和最小纵坐标
maxc1,maxr1=max(a,c),max(b,d) # 矩阵1的最大横坐标和最大纵坐标
minc2,minr2=min(x,z),min(y,r) # 矩阵2的最小横坐标和最小纵坐标
maxc2,maxr2=max(x,z),max(y,r) # 矩阵2的最大横坐标和最大纵坐标
s=[] # 用来存储矩阵1的所有下标
res=0 # 重叠面积
for i in range(minc1,maxc1): # 遍历矩阵1
for j in range(minr1,maxr1):
s.append((i,j))
for i in range(minc2,maxc2): # 遍历矩阵2
for j in range(minr2,maxr2):
if (i,j) in s:
res+=1
print(res)
这道题其实并不难,我一开始的思路是:
相交面积=相距最远的两个顶点坐标围成的大长方形面积-两个小长方形面积之和
但很快发现这样写不仅繁琐容易出错,而且始终避免不了判断两个长方形是否相交这一步,因此我直接根据题目中给出的样例来写,不必猜测哪个长方形离原点更近等问题,反倒通俗简单:
先假定相交,求出相交长方形的两个顶点坐标,再根据这两个坐标判断是否真的相交。若相交求其面积,否则输出“0.00”。
当然这样做有个前提:若输入的两个矩形的确相交,那么在输入的四组坐标里面,必须含有两组是相交部分矩形的顶点坐标。
另外,我发现Java题目中若要求最后的结果保留几位小数,并不需要进行四舍五入,直接按要求的小数位数输出即可。