油滴扩展( box)
【问题描述】
在一个长方形框子里,最多有N(O≤Ns6)个相异的点。在其中任何~个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这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
==========================
一个节点判断错了。。。。。
---------------------------------------
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!
==================
type
re=record
x,y:longint;
r:extended;
end;
var
n:longint;
x,y,x1,y1:longint;
a,zhan:array[-1..6]of re;
bool:array[1..6]of boolean;
ans:extended;
procedure init;
begin
assign(input,'box.in');
assign(output,'box.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure swap(var a,b:longint);
var
tem:longint;
begin
tem:=a; a:=b; b:=tem;
end;
procedure dfs(t:longint;tot:extended);
var
i,j:longint;
r,ti:extended;
begin
if t>n then
begin
if ans<tot then ans:=tot;
exit;
end;
for i:=1 to n do
if bool[i] then
begin
bool[i]:=false;
r:=maxlongint;
for j:=-1 to t-1 do
begin
if (j=-1)or(j=0) then{注意}
begin
ti:=sqrt(sqr(a[i].x-zhan[j].x));
if ti>sqrt(sqr(a[i].y-zhan[j].y)) then
ti:=sqrt(sqr(a[i].y-zhan[j].y));
end
else
ti:=sqrt(sqr(zhan[j].x-a[i].x)+sqr(zhan[j].y-a[i].y))-zhan[j].r;
if r>ti then r:=ti;
end;
//if r>0 then {注意}
if r<0 then r:=0;
zhan[t].x:=a[i].x; zhan[t].y:=a[i].y; zhan[t].r:=r;
dfs(t+1,tot+pi*r*r);
bool[i]:=true;
end;
end;
procedure main;
var
i:longint;
begin
readln(n);
readln(x,y,x1,y1);
if x>x1 then swap(x1,x);
if y>y1 then swap(y1,y);
for i:=1 to n do readln(a[i].x,a[i].y);
fillchar(bool,sizeof(bool),true);
zhan[0].x:=x; zhan[0].y:=y; zhan[0].r:=0;
zhan[-1].x:=x1; zhan[-1].y:=y1; zhan[-1].r:=0;
ans:=0;
dfs(1,0);
writeln((x1-x)*(y1-y)-ans:0:0)
end;
begin
init;
main;
terminate;
end.