正题
大意
有n个正方形,求块数。
解题思路
用并查集求块数
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int i,lt[7001],x1[7001],y1[7001],x2[7001],y2[7001],n,s;
int father(int x)
{if (lt[x]!=x) lt[x]=father(lt[x]);return lt[x];
}//找祖先
void unionn(int x,int y)
{int fa=father(x);int fb=father(y);if (fa!=fb) lt[fa]=fb;
}//连接
bool ok(int r1x1,int r1y1,int r1x2,int r1y2,int r2x1,int r2y1,int r2x2,int r2y2)
{if (r1x2<r2x1 || r2x2<r1x1) return false;if (r1y2<r2y1 || r2y2<r1y1) return false;if ((r1x1==r2x2 || r1x2==r2x1)&&(r1y1==r2y2 || r1y2==r2y1)) return false;else return true;
}//确定两个方块是否重合
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) lt[i]=i;for (int i=1;i<=n;i++){scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);for (int j=1;j<i;j++){if (father(i)!=father(j))if (ok(x1[j],y1[j],x2[j],y2[j],x1[i],y1[i],x2[i],y2[i])){unionn(i,j);//连接}}}for (int i=1;i<=n;i++) if (father(i)==i) s++;//统计printf("%d",s);
}