SDNUOJ1016矩形合并
2024-10-21 12:02:07
题意:
给出n个矩形,把重合的矩形归成一个图形,问合并以后剩下几个图形
思路:
我开始想用dfs,但是发现不太行。
后来知道才是并查集 Orz
用一个结构体数组存矩形的左下角和右上角的坐标,再用一个一维数组来进行并查集的查找合并。
进行两层for循环,对i找i以后的矩形用不用合并,判断用不用合并的条件就是a的左下角在b右上角的左下方,a的右上角在b的左下角的右上方。
如果是需要合并,我们就找到这两个点的祖先,修改一维数组的值,最后只想要循环一遍,看看祖先是本身的有几个,即为答案。
#include<bits/stdc++.h>
using namespace std;
#define MAX 120+5
typedef long long ll ;
int tr[MAX], n;
struct ran
{
int x1, y1, x2, y2;
}ar[MAX];
int judge(ran a, ran b)
{
if(a.x1 < b.x2 && a.y1 < b.y2 && a.x2 > b.x1 && a.y2 > b.y1)
return 1;
else
return 0;
}
void init()//初始化
{
for(int i = 0; i <= n; i++)
tr[i] = i;
}
int tfind(int x)//找爹函数
{
if(tr[x] == x)
return x;
else
return tr[x] = tfind(tr[x]);//这里是先进行的赋值操作再进行的return操作
}
void tmerge(int a, int b)//合并操作
{
int x = tfind(a);
int y = tfind(b);
if(x != y)//我是采用的以左为尊的原则
tr[y] = x;
}
int main()
{
cin>>n;
init();//初始化
for(int i = 1; i <= n; i++)
{
cin>>ar[i].x1>>ar[i].y1>>ar[i].x2>>ar[i].y2;
}
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
if(judge(ar[i], ar[j]))
tmerge(i, j);
}
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(tr[i] == i)
++ans;
}
cout<<ans<<endl;
return 0;
}
最新文章
- 原生js实现fadein 和 fadeout
- redis-内存异常 Redis is configured to save RDB snapshots解决
- AppDelegate动态加载StoryBoard
- asp值mysql驱动
- 关于synchronized 影响可见性的问题
- Siege——多线程编程最佳实例
- C#获取相对路径的方法
- R12 - OM改进了对成本与收入确认的流程
- mongoDB 3.0.3 以上GUI 连接认证问题
- 我使用过的Linux命令之file - 检测并显示文件类型
- 1. Skippr
- CEPH s3 java sdk PUT对象并在同一个PUT请求中同时设置ACL为 Public
- 关于减少BUG的思考
- 调用约定__cdecl __fastcall与__stdcall
- 流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署
- Java项目多数据源配置 (转)
- 洛谷 [USACO09OPEN]工作调度
- K8S网络排故障一则--iptables规则
- Java实现-2016百度秋招(颜色反转、相似字符串)
- js获取当前域名的方法