在漫长的产奶期间,奶牛贝茜喜欢透过窗户盯着马路对面的两个巨大的矩形广告牌,上面写着“农夫亚历克斯的惊人开胃苜蓿”和“农夫格雷格的大粒谷物”。
广告牌上这两种精美的牛饲料看上去比农场里的草美味的多。
有一天,当贝茜凝视着窗外时,她惊异地看到一辆巨大的矩形卡车停在马路对面。
卡车的侧面有一个广告,上面写着“农夫史密斯的精湛牛排”。
贝茜对此不太感兴趣,但她非常担心卡车可能会阻挡她观看最喜欢的两个广告牌的视野。
给定两个广告牌的位置和卡车的位置,请计算两个广告牌的仍然可见的总面积。
卡车可能挡到两个广告牌或只挡到其中一个,或都挡不到。
输入格式
第一行包含四个整数 ,其中
和
表示在贝茜的二维视野中,第一个广告牌的左下角和右上角坐标。
第二行按照如上形式,包含四个整数,表示第二个广告牌的左下角和右上角坐标。
第三行按照如上形式,包含四个整数,表示卡车侧面的左下角和右上角坐标。
输出格式
输出两个广告牌的仍然可见的总面积。
数据范围
保证两个广告牌之间重叠面积为 。
输入样例:
1 2 3 5
6 0 10 4
2 1 8 3
输出样例:
17
样例解释
第一块广告牌的可见面积为 ,第二块广告牌的可见面积为
。
- 暴力求相交面积:
using namespace std;
int a[10], b[10];
int get(){
int res = 0;
for(int l = 0; l <= 2; l += 2)
for(int i = a[l]; i < a[l + 1]; i++)
for(int j = b[l]; j < b[l + 1]; j++)
if(i >= a[4] && i < a[5] && j >= b[4] && j < b[5])
res++;
return res;
}
int main(){
for(int i = 0; i < 6; i++) cin >> a[i] >> b[i];
int res = 0;
res += (a[1] - a[0]) * (b[1] - b[0]);
res += (a[3] - a[2]) * (b[3] - b[2]);
cout << res - get() << endl;
return 0;
}
- 公式求相交面积
using namespace std;
int get(int a, int b, int c, int d)
{
return max(0, min(b, d) - max(a, c));
}
int area(int a[])
{
return (a[2] - a[0]) * (a[3] - a[1]);
}
int main()
{
int a[3][4];
for (int i = 0; i < 3; i ++ )
for (int j = 0; j < 4; j ++ )
cin >> a[i][j];
int res = 0;
for (int i = 0; i < 2; i ++ )
res += get(a[i][0], a[i][2], a[2][0], a[2][2])
* get(a[i][1], a[i][3], a[2][1], a[2][3]);
cout << area(a[0]) + area(a[1]) - res << endl;
return 0;
}