吃奶酪
题目描述
房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。
输入输出格式
输入格式:
第一行一个数n (n<=15)
接下来每行2个实数,表示第i块奶酪的坐标。
两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
输出格式:
一个数,表示要跑的最少距离,保留2位小数。
分析:直接dfs。
代码
const
maxn=20;
var
a:array[0..maxn,0..maxn] of real;
x,y:array[0..maxn] of real;
f:array[0..maxn] of boolean;
i,j,n:longint;
ans:real;
function sub(i,j:longint):real;
begin
sub:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
end;
procedure dfs(dep,o:longint;s:real);
var
i:longint;
begin
if s>=ans then exit;
if dep>=n then
begin
if s<ans then ans:=s;
exit;
end;
for i:=1 to n do
if (not f[i]) and (a[o,i]<>maxlongint) then
begin
f[i]:=true;
dfs(dep+1,i,s+a[o,i]);
f[i]:=false;
end;
end;
begin
readln(n);
ans:=maxlongint;
for i:=1 to n do
readln(x[i],y[i]);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=maxlongint;
for i:=0 to n-1 do
for j:=i+1 to n do
begin
a[i,j]:=sub(i,j);
a[j,i]:=a[i,j];
end;
dfs(0,0,0);
if ans=maxlongint then ans:=0;
writeln(ans:0:2);
end.