P1378 油滴扩展(回溯,枚举)

本文探讨了一个关于在有限矩形区域内放置多个油滴并使其扩展的问题。目标是通过不同的放置顺序来最大化油滴覆盖的总面积,并给出了具体的算法实现,包括使用回溯法生成所有可能的顺序组合。

P1378 油滴扩展(回溯,枚举)

题目描述

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

输入输出格式

输入格式:

第1行一个整数N。
第2行为长方形边框一个顶点及其对角顶点的坐标,x,y,x’,y’。
接下去N行,每行两个整数xi,yi,表示盒子的N个点的坐标。
以上所有的数据都在[-1000,1000]内。

输出格式:

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

输入输出样例

输入样例:

2
20 0 10 10
13 3
17 7

输出样例:

50

解题分析

放置油滴的顺序不同,就可能得到不同的结果。
利用回溯法得到1到n的所有不同的排列,然后对每一种排列所得到的放置油滴的顺序进行枚举,得到每一种方式所得到圆的最大面积。

注意:要判断一个油滴的圆心是否在另一个已放置油滴的所形成的圆的内部,如果是,则其半径为0。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
#define PI 3.1415926
struct point{
	int x;
	int y;	
}e[8], ret[2];
int n, a[8];
double d[8][8], ans=0; 

double s(double r){
		return PI*r*r;
}

double dis(point p1, point p2){
	double dx = p1.x - p2.x, dy = p1.y - p2.y;
	return sqrt(dx*dx + dy*dy);
}

void ini(){
	int i, j;
	for(i=1; ir1[j1])
				r = min(r, d[i1][j1] - r1[j1]);
			else
				r = 0;
		}
		r1[i1] = r;
		ans1 += s(r);
	}
	if(ansn){		
		solve();			
		return;
	} 
	for(i=depth; i<=n; i++){
		swap(a[depth], a[i]);
		dfs(depth+1);
		swap(a[depth], a[i]);
	}
}
int main(){
	ios::sync_with_stdio(false);
	int i, x, y, cnt = 1;
	cin>>n;
	cin>>ret[0].x>>ret[0].y>>ret[1].x>>ret[1].y;
	for(i=1; i<=n; i++){
		cin>>e[i].x>>e[i].y;
		a[i] = i;		
	}	
	ini();
	dfs(1);	
	cout<<(int)(abs((ret[0].x-ret[1].x)*(ret[0].y - ret[1].y)) - ans + 0.5)<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值