【搜索】油滴扩展

本文探讨了一个关于油滴在矩形框内扩展的问题,旨在寻找最佳放置油滴的顺序以最大化占据空间。通过递归深度优先搜索算法,结合几何计算确定油滴的最大扩展范围。

1. 油滴扩展( box)

【问题描述】

在一个长方形框子里,最多有N(O≤N≤6)个相异的点。在其中任何~个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这N个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)

注:圆的面积公式V=pi*r*r,其中r为圆的半径。

【输入】

第一行一个整数N。

第二行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。

接下去N行,每行两个整数XI,yi,表示盒子内N个点的坐标。

以上所有的整数都在[-1000,1000]内。

【输出】

一行,一个整数,长方形盒子剩余的最小空间(结果四舍五人输出)。

【输入样例】

  2

0 0 10 10

  3 3

  7 7

【输出样例】

  50


提交次数4

1、WA10,很傻比的,没有考虑x,y,x`,y`究竟是左上还是右下,因此被坑了。

2、WA10,

3、WA40,很傻比的,用了四个名字很像的数组,x,X,y,Y,于是把它们混淆了。

4、AC


#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>

#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))

double x[10],y[10],X[10],Y[10],r[10];
double a,b,c,d;
bool used[10];
double ans = 0;
long n;
const double pi = 3.1415926535897932384626433832795;

long getint()
{
	long rs=0;char tmp;bool sgn=1;
	do tmp = getchar();
	while (!isdigit(tmp)&&tmp-'-');
	if (tmp=='-'){sgn=0;tmp=getchar();}
	do rs=(rs<<3)+(rs<<1)+tmp-'0';
	while (isdigit(tmp=getchar()));
	return sgn?rs:-rs;
}

void dfs(long l,double s)
{
	if (l == n+1)
	{
		ans = MAX(ans,s);
		return;
	}
	for (long i=1;i<n+1;i++)
	{
		if (!used[i])
		{
			used[i] = true;
			x[l] = X[i];
			y[l] = Y[i];

			r[l] = MIN(MIN(X[i]-a,c-X[i]),MIN(Y[i]-b,d-Y[i]));
			for (long j=1;j<l;j++)
			{
				r[l] = MIN(r[l],sqrt((x[j]-X[i])*(x[j]-X[i])+(y[j]-Y[i])*(y[j]-Y[i]))-r[j]);
				if (r[l] <= 0)
				{
					r[l] = 0;
					break;
				}
			}
			dfs(l+1,s+pi*r[l]*r[l]);
			used[i] = false;
		}
	}
}
int main()
{
	freopen("box.in","r",stdin);
	freopen("box.out","w",stdout);
	n = getint();
	a = getint();
	b = getint();
	c = getint();
	d = getint();

	if (c < a)
	{
		double tmp = c;
		c = a;
		a = tmp;
	}
	if (d < b)
	{
		double tmp = d;
		d = b;
		b = tmp;
	}

	for (long i=1;i<n+1;i++)
	{
		X[i] = getint();
		Y[i] = getint();
	}
	dfs(1,0);
	printf("%.0lf",(c-a)*(d-b)-ans);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值