倒水问题exit201溢出
pascal吧
全部回复
仅看楼主
level 2
const
maxstep=1000;
maxn=5000;
var
result:integer;
R:array[0..3,1..maxn] of integer;
Ro:array[1..3] of integer;
f1,f2:text;
procedure init();
begin
readln(f1,Ro[1],Ro[2],Ro[3],result);
R[0,1]:=0;
R[1,1]:=Ro[1];
R[2,1]:=0;
R[3,1]:=0;
end;
function c1(j:integer):boolean;
var
cc:boolean;
a:integer;
begin
cc:=true;
while(a<j) and(cc=true) do
if (R[1,a]=R[1,j]) and (R[2,a]=R[2,j]) and (R[3,a]=R[3,j]) then
begin
cc:=false;
inc(a);
end;
c1:=cc;
end;
function pd(j:integer):boolean;
begin
if (R[1,j]=result) or (R[2,j]=result) or (R[3,j]=result) then
pd:=true
else pd:=false;
end;
procedure outresult(j:integer);
var
Rway:array[1..maxstep] of integer;
k,l:integer;
begin
k:=1;
while j<>0 do begin
Rway[k]:=R[0,j]; {由此节点0行追寻父节点下标并记录至Rway数组}
inc(k);
j:=R[0,j];
end;
for l:=k downto 1 do
writeln(f2,R[1,Rway[l]],' ',R[2,Rway[l]],' ',R[3,Rway[l]]);
end;
procedure split();
var
i,j,temp,b,c:integer;
begin
if result>Ro[1] then begin
writeln(f2,'Not found');
exit;
end;
if pd(1) then begin
outresult(1);
exit;
end;
i:=1;
j:=2;
while (i<j) and (j<=maxn) do
begin
for b:=1 to 3 do {被倒水杯}
begin
if R[b,i]<Ro[b] then
for c:=1 to 3 do
begin
if (c<>b) and (R[c,i]>0) then
begin
R[1,j]:=R[1,i];
R[2,j]:=R[2,i];
R[3,j]:=R[3,i];
temp:=Ro[b]-R[b,j];
if temp>R[c,j] then
begin
R[b,j]:=R[b,j]+R[c,j];
R[c,j]:=0;
end
else begin
R[b,j]:=Ro[b];
R[c,j]:=R[c,j]-temp;
end;
if c1(j) then
begin
R[0,j]:=i;
if pd(j) then
begin
outresult(j);
exit;
end
else inc(j);
end;
end;
end;
end;
inc(i);
end;
writeln(f2,'Not found');
end;
begin
assign(f1,'water.in'); reset(f1);
assign(f2,'water.out'); rewrite(f2);
init;
split;
close(f1);
close(f2);
end.
2014年12月26日 02点12分 1
1