P1378油滴扩展(搜索)

做笔记。

给你一个长方形,和长方形里面的一些点,每个点可以放置一个油滴,油滴可以扩展,知道遇到边界或者其他的油滴才会停止扩展,要你选择最合适的顺序放置油滴使得剩下的区域最小。

要求输出剩下的最小的面积

其实就是一个深搜的题目(或者是求全排列),搜出所有情况,然后取最大的面积就好了

复制代码
#include<cmath>
#include<iostream>
#define PI 3.14159265358
using namespace std;
const int N=10;
double xa,ya,xb,yb;
int n;
double x[N],y[N];
double r[N];
bool vis[N];
double res=0;
double cal(int i)//计算此时可以扩展的最大的半径
{
    double s1=min(abs(x[i]-xa),abs(x[i]-xb));
    double s2=min(abs(y[i]-ya),abs(y[i]-yb));
    double ans=min(s1,s2);//边界
    for(int j=1;j<=n;j++)
    {
        if(i!=j&&vis[j])
        {
            double d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//计算同其他的已经放置的油滴的距离
            ans=min(ans,max(d-r[j],0.0))//如果此时的油滴已经在某个油滴扩展区域的内部了,通过max将其pass掉
        }
    }
    return ans;
}
void dfs(int now,double sum)//常规搜索
{
    if(now>n)
    {
        res=max(res,sum);
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            vis[i]=true;
            r[i]=cal(i);
            dfs(now+1,sum+PI*r[i]*r[i]);
            vis[i]=false;
        }
    }
}
int main(void)
{
    cin>>n;
    cin>>xa>>ya>>xb>>yb;
    int s=abs(xa-xb)*abs(ya-yb);
    for(int i=1;i<=n;i++)
        cin>>x[i]>>y[i];
    dfs(1,0);
    cout<<int(s-res+0.5);
    return 0;
}
复制代码
posted on   greenofyu  阅读(200)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示