SSLOJ1222 矩形

Description

在一个平面上有n个矩形。每个矩形的边都平行于坐标轴并且都具有值为整数的顶点。我们用如下的方式来定义块。
 每一个矩形都是一个块。
 如果两个不同的矩形有公共线段,那么它们就组成了一个新的块来覆盖它们原来的两个块。
写一个程序:
 从文件PRO.IN中读入矩形的个数以及它们的顶点。
 找出这些矩形形成的不同的块的个数。
 将结果写入文件PRO.OUT。

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

思路

只需用并查集求个数,重点是是否需要合并。
code:

#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
int fa[7001],n;
int e;
struct f{
    
    
 int x,y,x1,y1;
} a[7001];
int find(int x)
{
    
    
 if (fa[x]==x) return x;
 else return fa[x]=find(fa[x]);
}
int main()
{
    
    
 cin>>n;
 for (int i=1;i<=n;i++)
 {
    
    
  e++;
  cin>>a[i].x>>a[i].y>>a[i].x1>>a[i].y1;
  fa[i]=i;
  for (int j=i-1;j>=1;j--)
  {
    
    
   if (find(i)==find(j)) continue;
   if ((a[i].x>a[j].x1||a[i].y>a[j].y1)||(a[j].x>a[i].x1||a[j].y>a[i].y1)||(a[j].x==a[i].x1&&a[j].y==a[i].y1)||(a[i].x==a[j].x1&&a[i].y==a[j].y1)) continue;
   if ((min(a[i].x1,a[j].x1)-max(a[j].x,a[i].x))>=0&&(min(a[i].y1,a[j].y1)-max(a[j].y,a[i].y))>0)
   {
    
    
    fa[find(i)]=find(j);
    e--;
    continue;
   }
   if ((min(a[i].x1,a[j].x1)-max(a[j].x,a[i].x))>0&&(min(a[i].y1,a[j].y1)-max(a[j].y,a[i].y))>=0)
   {
    
    
    fa[find(i)]=find(j);
    e--;
    continue;
   }
  }
 }
 cout<<e;
 return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_49843717/article/details/112915370