7.14-B-画圈求总覆盖面积

本文介绍了一道编程题目,学姐需要计算多个半径为1的圆覆盖的总面积。通过记录每个1*1正方形的覆盖情况,并根据被圆心覆盖的数量不同而采用不同的面积计算公式,最终得出总面积。

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

时间限制 1000 ms 内存限制 65536 KB

题目描述

学姐正在写作业,但是她写着写着就开始想学弟,走神的她就开始在纸上画圈圈。这时学弟突然出现了,好奇的学弟问学姐在做什么,惊慌之下,学姐随口说想算一下这些圆覆盖的面积为多少。学弟顿时非常仰慕学姐,但是学姐突然意识到自己不会做,为了自己能给学弟留下好印象,她来求助你帮她算出来这些圆覆盖的面积。
为了简化问题,我们假设所有圆的半径都为1。

输入格式

输入有多组数据。开头为一个整数T(T10),表示数据组数,接下来T组输入,每组开头为一个整数n(1n100),表示学姐画的圆的个数,接下来n行,每行两个整数xi,yi,表示圆的圆心坐标,1xi,yi100

输出格式

输出一个数,表示面积并,精确到小数点后五位。

输入样例

1
2
1 1
2 1

输出样例

5.05482
注意!:题中xi,yi为整数点,每个1*1的正方形覆盖情况有限,所以记录这些方块,分别计算面积再叠加。方法很巧妙。
    PI/4          PI/6+sqrt(3)/4         1
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define PI 3.141592653

using namespace std;

int main()
{
    int t,n,x,y,maxx,maxy,vis[110][110],a;
    double sum;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        maxx=0;maxy=0;
        sum=0;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d %d",&x,&y);
            vis[x][y]=1;
            maxx=max(x,maxx);
            maxy=max(y,maxy);
        }
        for(int i=0;i<=maxx+1;i++)
        {
            for(int j=0;j<=maxy+1;j++)
            {
                a=vis[i][j]+vis[i][j+1]+vis[i+1][j]+vis[i+1][j+1];
                if(a==1)
                    sum+=PI/4;
                else if(a==2)
                {
                    if(vis[i][j]+vis[i+1][j+1]==2||vis[i+1][j]+vis[i][j+1]==2)
                        sum+=1;
                    else
                        sum+=PI/6+sqrt(3)/4;
                }
                else if(a>=3)
                    sum+=1;
            }
        }
        printf("%.5lf\n",sum);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值