18233 万湖之国的形成

本文介绍了一种模拟万湖之国形成的算法。该算法通过计算圆形坑洞的交叠情况来确定最终形成的湖泊数量。输入包括坑洞的数量及每个坑洞的圆心坐标和半径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                    18233 万湖之国的形成

                                                       时间限制:2500MS  内存限制:65535K

提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

N国原是一块平原上,没有湖,直到一颗小行星撞入大气层碎成成千上万的碎片,碎片再撞击地面形成
一个一个的坑, 下雨之后,最终形成万湖之国。
现在科学家想用计算机模拟万湖之国形成过程,假设每一块碎片撞击地面,都撞出一个园形坑,现在知道
每一个碎片造成的坑的圆心和半径,问每个坑都注满水后,最终形成多少个湖

输入格式

第一行一个整数N,1<=N<=100,000,表示坑的数量
此后N行,每一行三个double实数,前两个数是圆心的坐标x和y,最后一个数是圆半径(不大于1000)
(数据随机产生,分布均匀)

输出格式

湖的个数

输入样例

3
0 0 5
10 0 5
11.1 0 2.5

输出样例

2
#include <iostream>//!!万湖之国
#include <algorithm>
using namespace std;
int p[100050];
struct circle
{
    double x,y;
    double r;
} c[100050]; //设置成这个大小的原因
bool com(struct circle a,struct circle b)//每个圆右端点的位置大小,给每个圆排序
{
    return a.x+a.r<b.x+b.r ;
}
long long find(int x)
{
    if(p[x]==x) return x;
    else return p[x]=find(p[x]);
}
int main()
{
    long long  n;
    long long count;
    cin >>n;
    count=n;
    for(int i=0; i<n; i++)
    {
        cin>>c[i].x>>c[i].y>>c[i].r;
        p[i]=i;//!!
    }
    sort(c,c+n,com);//!!按照圆的右端点位置排序
    for(int i=0; i<n; i++)
    {
        for(int j=i-1; j>=0; j--)//!!和第i个圆的左边的j个圆比较
        {
            if(c[j].x+c[j].r<=c[i].x-c[i].r) break;//!!第i个圆的左端点横坐标值是否大于前面的第j个圆右端点横坐标值
            if(((c[j].x-c[i].x)*(c[j].x-c[i].x)+(c[j].y-c[i].y)*(c[j].y-c[i].y))<(c[j].r+c[i].r)*(c[j].r+c[i].r))//d<r1+r2
            {
                long long r,l;
                r=find(i);
                l=find(j);
                if(r!=l) count--;//如果两个圆的父结点不同,圆坑数量-1
                p[r]=l;//把两个圆坑合为一个,父节点相同
            }
        }
    }
    cout << count<< endl;
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值