思路上很容易想到即使用一个标记数组对上过色的模块进行标记,最后遍历该数组得到被标记的模块数即可
#include<iostream> using namespace std; int mapp[105][105]; int ans=0; int main(){ int n; cin>>n; for(int i=0;i<n;i++){ int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; for(int x=x1;x<x2;x++){ for(int y=y1;y<y2;y++){//注意点与格子的区别 mapp[x][y]++; } } } for(int i=0;i<=100;i++){ for(int j=0;j<=100;j++){ if(mapp[i][j]){ ans++; } } } cout<<ans<<endl; return 0; }
此外,我们实际上可以很容易计算得到矩形的大小,那么我们将所有的矩形面积相加再减去重叠的部分即可,这里也使用一个标记数组进行标记,只不过我们遇到已经标记过的格子就减去1即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; const double eps = 1e-6; const int INF=0x3f3f3f3f; const int MOD=1e9+7; const int N = 1e3+5; bool flag[N][N]; int main() { int n,sum=0; cin>>n; for(int i=0; i<n; i++) { int x1,x2,y1,y2; cin>>x1>>y1>>x2>>y2; sum+=(x2-x1)*(y2-y1); for(int i=x1; i<x2; i++) { for(int j=y1; j<y2; j++) { if(flag[i][j]) sum--; flag[i][j]=1; } } } cout<<sum; return 0; }