几何分析法
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int calculate_square(int x1, int y1, int x2, int y2);
int main()
{
int x[7], y[7],s1, s2, minus_s1, minus_s2;
scanf("%d %d %d %d", &x[1], &y[1], &x[2], &y[2]);
scanf("%d %d %d %d", &x[3], &y[3], &x[4], &y[4]);
scanf("%d %d %d %d", &x[5], &y[5], &x[6], &y[6]);
s1 = calculate_square(x[1], y[1], x[2], y[2]);
s2 = calculate_square(x[3], y[3], x[4], y[4]);
if((max(x[5],x[1])<=min(x[6],x[2]))&&(max(y[5], y[1])<= min(y[6], y[2])))
minus_s1 = calculate_square(max(x[5],x[1]),max(y[5], y[1]), min(x[6],x[2]), min(y[6], y[2]));//求矩形1 和3 相交的面积
else minus_s1 = 0;
if((max(x[5],x[3])<=min(x[6],x[4]))&&(max(y[5], y[3])<= min(y[6], y[4])))
minus_s2 = calculate_square(max(x[5],x[3]),max(y[5], y[3]), min(x[6],x[4]), min(y[6], y[4]));//求矩形2和3 相交的面积
else minus_s2 = 0;
printf("%d\n", s1+s2-minus_s1-minus_s2);
return 0;
}
int calculate_square(int x1, int y1, int x2, int y2)
{
int x, y, s;
x = abs(x1- x2);
y = abs(y1- y2);
s = x * y;
return s;
}
差分矩阵
#include<iostream>
using namespace std;
const int N = 2010;
int a[N][N], b[N][N];
void insert(int x1, int y1, int x2, int y2, int c)
{
b[x1][y1] += c;
b[x2 + 1][y1] -= c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y2 + 1] += c;
}
int main()
{
int x1, y1, x2, y2, m = 3;
while(m--)
{
cin >> x1 >>y1 >> x2 >> y2;
x1 += 1001; y1 += 1001; x2 += 1001; y2 += 1001;//因为坐标范围[-1000, 1000], 加上1001, 保证坐标为正数
if(m) insert(x1, y1, x2 - 1, y2 - 1, 1);
else insert(x1, y1, x2 - 1, y2 - 1, -1);//当第三块时 -1, 可减去与1, 2 相交的部分
}
int sum = 0;
for(int i = 1; i <= 2000; i ++)
for(int j = 1; j <= 2000; j++)
{
a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];
if(a[i][j] > 0) sum ++;
}
cout << sum << endl;
return 0;
}