矩形

Description

在一个平面上有n个矩形。每个矩形的边都平行于坐标轴并且都具有值为整数的顶点。我们用如下的方式来定义块。
每一个矩形都是一个块。
如果两个不同的矩形有公共线段,那么它们就组成了一个新的块来覆盖它们原来的两个块。
例子:
在图1中的矩形组成了两个不同的块。

Input

在输入文件PRO.IN的第一行又一个整数n,1 <= n <=7000,表示矩形的个数。接下来的n行描述矩形的顶点,每个矩形用四个数来描述:左下顶点坐标(x,y)与右上顶点坐标(x,y)。每个矩形的坐标都是不超过10000的非负整数。

Output

在文件PRO.OUT的第一行应当仅有一个整数—表示由给定矩形组成的不同的块的个数。

Sample Input

9
0 3 2 6
4 5 5 7
4 2 6 4
2 0 3 2
5 3 6 4
3 2 5 3
1 4 4 7
0 0 1 4
0 0 4 1

Sample Output

2

题目分析

输入一堆长方形,看有多少个板块
如果多个长方形重合或边相通,就算一个板块

解题思路

这题我们可以把每一个板块都看成一个集合,用并查集将它们相通,最后求板块的个数
并查集的个人理解

AC代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,s,father[7005];
struct node
{
   
	int x1,y1,x2,y2;
}a[7005];
int find(int x)//找爸爸,看是否属于同一集合
{
   
	if(father[x]==x)return x;
	return father[x]=find(father[x]);
}
void bcj(int x,int y)//合并集合
{
   
	int x1=find(x),y1=find(y);
	father[x1]=y1; 
}
bool check(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;
    return true;
}
int main()
{
   
	cin>>n;
	for(int i=1;i<=n;i++)
	 cin>>a[i].x1>>a[i].y1>>a[i].x2>>a[i].y2;
	for(int i=1;i<=n;i++)father[i]=i;
	for(int i=1;i<=n;i++)//看长方形相通的个数
	 for(int j=1;j<i;j++)
	  if(find(i)!=find(j))//如果不是同一集合
	   if(check(a[j].x1,a[j].y1,a[j].x2,a[j].y2,a[i].x1,a[i].y1,a[i].x2,a[i].y2))//并且重合或相通
		{
   
			bcj(i,j);//就将两个相通
			s++;//加1
		}
	cout<<n-s;//输出
	return 0;
}

谢谢