题目:
有三个分别容量分别为a升、b升和c升的杯子(c>b>a>0,且b与a互质)
初始时:c杯装满水有10升,a与b均为空,容量分别为:3升、7升。
规则:
1、三个杯子相互倒水且不准把水倒往三个杯子之外,
2、每次倒水必须是把目标杯装满或是倒出水的杯子已空才能停止。
要求:给出各杯子的容量,请用最少的倒水次数,使C杯中剩余d升水。
程序:
var
man:array[1..3] of longint=(3,7,10);
data:array[1..400,1..4] of longint;
bz:array[0..3,0..7,0..10] of boolean;
i,j,d,p,q:longint;
begin
readln(d);
bz[0,0,10]:=true;
data[1,1]:=0;
data[1,2]:=0;
data[1,3]:=10;
i:=0;
j:=1;
repeat
inc(i);
for p:=1 to 3 do
for q:=1 to 3 do
if (p<>q)and(data[i,p]>0)and(data[i,q]<man[q]) then
begin
inc(j);
data[j]:=data[i];
data[j,4]:=data[i,4]+1;
if man[q]>=data[j,p]+data[j,q] then
begin
data[j,q]:=data[j,q]+data[j,p];
data[j,p]:=0;
end
else
if data[j,p]>=man[q]-data[j,q] then
begin
data[j,p]:=data[j,p]-(man[q]-data[j,q]);
data[j,q]:=man[q];
end;
if bz[data[j,1],data[j,2],data[j,3]] then dec(j)
else
begin
bz[data[j,1],data[j,2],data[j,3]]:=true;
if data[j,3]=d then
begin
writeln(data[j,4]);
halt;
end;
end;
end;
until i>=j;
end.