在漫长的挤奶过程中,奶牛 Bessie 喜欢透过谷仓的窗户盯着街对面的两块巨大的矩形广告牌,上面分别写着“Farmer Alex 的美味苜蓿”和“Farmer Greg 的优质谷物”。广告牌上这两种奶牛饲料的图片对 Bessie 来说比她农场里的草看起来美味得多。
有一天,当 Bessie 正盯着窗外时,她惊讶地看到一辆巨大的矩形卡车停在街对面。卡车的侧面有一则广告,写着“Farmer Smith 的顶级牛排”,Bessie 不太理解这则广告,但她更担心的是卡车可能会挡住她最喜欢的两块广告牌的视线。
给定两块广告牌和卡车的位置,请计算两块广告牌仍然可见的总面积。卡车可能遮挡了其中一块、两块,或者没有遮挡任何一块广告牌。
输入格式
输入的第一行包含四个用空格分隔的整数:x1,y1,x2,y2,其中 (x1,y1) 和 (x2,y2) 是 Bessie 的二维视野中第一块广告牌的左下角和右上角坐标。第二行包含四个整数,以相同的方式指定第二块广告牌的左下角和右上角坐标。第三行也是最后一行输入包含四个整数,指定卡车的左下角和右上角坐标。所有坐标都在 −1000 到 +1000 的范围内。保证两块广告牌之间没有任何重叠的正面积区域。
输出格式
请输出两块广告牌仍然可见的总面积。
输入输出样例
输入 #1
1 2 3 5 6 0 10 4 2 1 8 3
输出 #1
17
说明/提示
在这个例子中,第一块广告牌有 5 单位面积可见,第二块广告牌有 12 单位面积可见。
题目来源:Brian Dean
【代码示例】
#include <bits/stdc++.h>
using namespace std;
struct ad {
int x1, y1, x2, y2;
} a, b, c;
int area(ad a, ad c) {
int m_a = (a.x2 - a.x1) * (a.y2 - a.y1);
int m_c = (c.x2 - c.x1) * (c.y2 - c.y1);
if (c.x1 < a.x1 && c.y1 < a.y1 && c.x2 > a.x2 && c.y2 > a.y2) {
m_a = 0;
} else if (c.x1 > a.x1 && c.y1 > a.y1 && c.x2 < a.x2 && c.y2 < a.y2) {
m_a -= m_c;
} else if (c.x1 > a.x2) {
//右侧
} else if (c.x2 < a.x1) {
//左侧
} else if (c.y2 < a.y1) {
//下方
} else if (c.y1 > a.y2) {
//上方
} else {
m_a -= (min(a.x2, c.x2) - max(a.x1, c.x1)) * (min(a.y2, c.y2) - max(a.y1, c.y1));
}
return m_a;
}
int main() {
cin >> a.x1 >> a.y1 >> a.x2 >> a.y2;
cin >> b.x1 >> b.y1 >> b.x2 >> b.y2;
cin >> c.x1 >> c.y1 >> c.x2 >> c.y2;
cout << area(a, c) + area(b, c) << endl;
}
