
#include<iostream> #include<math.h> #include<algorithm> #include<stdio.h> #include<vector> #include<memory.h> #include<queue> #define INF 10000000 typedef long long ll; using namespace std; int W,H,N; int X1[505],X2[505],Y1[505],Y2[505]; //填充用 bool fld[3005][3005]; const int dx[4]={0,0,-1,1}; const int dy[4]={1,-1,0,0}; //对x1和x2进行坐标离散化,并返回离散化之后的宽度 int compress(int *x1,int *x2,int w) { vector<int> xs; for(int i=0;i<N;i++) { for(int d=-1;d<=1;d++) { int tx1=x1[i]+d,tx2=x2[i]+d; if(1<=tx1&&tx1<=w) xs.push_back(tx1); if(1<=tx2&&tx2<=w) xs.push_back(tx2); } } sort(xs.begin(),xs.end()); xs.erase(unique(xs.begin(),xs.end()),xs.end());//删除重复元素 for(int i=0;i<N;i++) { x1[i]=find(xs.begin(),xs.end(),x1[i])-xs.begin(); x2[i]=find(xs.begin(),xs.end(),x2[i])-xs.begin(); } return xs.size(); } int main() { cin>>W>>H>>N; for(int i=0;i<N;i++) { cin>>X1[i]>>X2[i]>>Y1[i]>>Y2[i]; } //坐标离散化 W=compress(X1,X2,W); H=compress(Y1,Y2,H); //填充有直线的部分 memset(fld,0,sizeof(fld)); for(int i=0;i<N;i++) { for(int y=Y1[i];y<=Y2[i];y++) { for(int x=X1[i];x<=X2[i];x++) { fld[y][x]=true; } } } //求区域的个数 int ans=0; for(int y=0;y<H;y++) { for(int x=0;x<W;x++) { if(fld[y][x]) continue; ans++; //bfs queue<pair<int,int> > que; que.push(make_pair(x,y)); while(!que.empty()) { int sx=que.front().first,sy=que.front().second; que.pop(); for(int i=0;i<4;i++) { int tx=sx+dx[i],ty=sy+dy[i]; if(tx<0||tx>=W||ty<0||ty>=H) continue; if(fld[ty][tx]) continue; que.push(make_pair(tx,ty)); fld[ty][tx]=true; } } } } cout<<ans<<endl; return 0; } /* 10 10 5 1 6 4 4 1 10 8 8 4 4 1 10 9 9 1 5 10 10 6 10 */ //ans=6