颜色叠加(模拟)

Description

👉HNUCM:2080

题目的大致意思是在平面上给出两个矩形左上角的坐标、长度和宽度,求出重叠部分的面积。【注意:此处定义与X轴平行的那组边为长边,与Y轴平行的那组边为宽边】

Input

单组输入。
第1行输入四个整数,分别表示蓝色长方形透明卡片的左上角坐标(X坐标和Y坐标)、长和宽。两两之间用英文空格隔开。
第2行输入四个整数,分别表示黄色长方形透明卡片的左上角坐标(X坐标和Y坐标)、长和宽。两两之间用英文空格隔开。
两张长方形透明卡片的X坐标和Y坐标的取值范围为[-1000, 1000],长和宽的取值范围为[1,200]。

Output

输出一个非负整数,表示两张卡片叠加后所形成的绿色区域的面积。

Sample Input

0 100 200 100
100 150 75 75

Sample Output

1875

Analysis

两种方法都是模拟,思路不同
注意题目中已经说明与X轴平行的那组边为长边,与Y轴平行的那组边为宽边
因为输入的坐标有可能存在负数,所以不能通过二维数组标记的方式模拟

Code

  • 方法一:根据两个矩形的最高和最低水平线、最左和最右竖直线的相对位置来判断重叠的情形
    在这里插入图片描述
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
    int top,bottom,left,right;
}e[2];

int fun(node e1,node e2){
    if(e1.bottom>=e2.top||e1.top<=e2.bottom) return 0;
    if(e1.right<=e2.left||e1.left>=e2.right) return 0;
    int a=min(e1.right,e2.right)-max(e1.left,e2.left);
    int b=min(e1.top,e2.top)-max(e1.bottom,e2.bottom);
    return a*b;
}

int main(){
    int x,y,a,b;
    for(int i=0;i<2;i++){
        scanf("%d%d%d%d",&x,&y,&a,&b);
        e[i].top=y;
        e[i].left=x;
        e[i].bottom=y-b;
        e[i].right=x+a;
    }
    printf("%d\n",fun(e[1],e[0]));
    return 0;
}
  • 方式二:求得dx,dy,再由(x,y)和(xx,yy)的相对位置来计算重叠矩形长度和宽度
    在这里插入图片描述
  #include <bits/stdc++.h>
  using namespace std;
  #define ll long long
  int main(){
      int x,y,xx,yy,a,b,aa,bb;
      scanf("%d%d%d%d",&x,&y,&a,&b);
      scanf("%d%d%d%d",&xx,&yy,&aa,&bb);
      int i,j,dx,dy;
      dx=abs(x-xx);
      dy=abs(y-yy);
      if(x<=xx)
          i=min(a-dx,aa);
      else
          i=min(aa-dx,a);
      if(y>=yy)
          j=min(b-dy,bb);
      else
          j=min(bb-dy,b);
      if(i<0||j<0) puts("0");
      else printf("%d\n",i*j);
      return 0;
  }
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值