题目概述
在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这个点上放置油滴,才能使放置完毕后所有油滴占据的总体积最大呢?(不同的油滴不会相互融合)
解题思路
这题就是一道纯粹的搜索。对于每个油滴,计算出它到矩形四个边界的距离,与之前放下的每个油滴的圆心距减去后者半径,这个油滴的半径就是这些数据中的最小值。
注意:pi应取3.141592653589;
当投放油滴的点已被覆盖(即圆心距大于已放下的油滴半径)时,半径应取0;
输出时的四舍五入应用trunc(x+0.5)实现。
时间复杂度:O(n!)
空间复杂度:O(n)
源程序
var
a:array[1..10,1..2]of longint;
c:array[1..10]of longint;
f:array[1..10]of double;
b:array[1..10]of boolean;
x1,y1,x2,y2,n,ans,m,rmt,i:longint;
rt,r,rm:double;
procedure dfs(d:longint);
var
i,j:longint;
begin
if d>n then begin
rm:=m;
for i:=1 to n do
rm:=rm-3.1415926535897932384*f[i]*f[i];
rmt:=trunc(rm+0.5);
if rmt<ans then ans:=rmt;
end;
for i:=1 to n do
begin
if b[i]=true then continue;
b[i]:=true;
c[d]:=i;
r:=abs(x1-a[i,1]);
if abs(x2-a[i,1])<r then r:=abs(x2-a[i,1]);
if abs(y1-a[i,2])<r then r:=abs(y1-a[i,2]);
if abs(y2-a[i,2])<r then r:=abs(y2-a[i,2]);
for j:=1 to d-1 do
begin
rt:=sqrt((a[c[j],1]-a[i,1])*(a[c[j],1]-a[i,1])+(a[c[j],2]-a[i,2])*(a[c[j],2]-a[i,2]));
if (rt>f[j])and(rt-f[j]<r) then r:=rt-f[j];
if (rt<f[j]) then r:=0; //注意考虑投放点已被覆盖的情况
end;
f[d]:=r;
dfs(d+1);
b[i]:=false;
end;
end;
begin
readln(n);
readln(x1,y1,x2,y2);
m:=abs((y2-y1)*(x2-x1));
ans:=m;
for i:=1 to n do
readln(a[i,1],a[i,2]);
dfs(1);
write(ans);
end.