茂名恒福尚城可以吗:请教一个问题 很常见的过河-pascal

来源:百度文库 编辑:高校问答 时间:2024/05/02 03:09:49
一个过河的题,n个人,要在深更半夜过一条河,那桥有点破,一次只能过俩人,这n个人要过河的时间分别为a[1],a[2]..a[n]分钟,过河时必须要有手电筒照明,可是却只有1个手电筒,又只能在相互间传,不能扔...要求m分钟内这n个人要全过去 写出如何走
我是这么写的
const
max=30;
lmax=max*3-4;
type
f=record
c:boolean;
a:integer;
end;
VAR
n,m,i,t,h:integer;
b:array[1..lmax]of integer;
p:array[1..max]of f;
r:boolean;
procedure print;
var
i:integer;
begin
i:=1;
r:=true;
while i<n*3-4 do
begin
write('(',b[i],',',b[i+1],')');
i:=i+2;
if i<3*n-1 then
begin write(b[i],',');inc(i);end;
end;
end;
procedure back;
var
i:integer;
function min:integer;
var i,j,k:integer;
begin
k:=m;
for i:=1 to n do
if (p[i].c)and(p[i].a<k) then
begin
k:=p[i].a;
j:=i;
end;
min:=j;
end;
begin
if h<3*n-4 then begin
i:=min;
p[i].c:=false;
b[h]:=i;
inc(h);
t:=t-p[i].a; end;
end;
procedure cross(i:integer);
var
o,j,e,z,x,l:integer;
u:boolean;
begin
u:=false;
for l:=1to n do if p[i].c=false then u:=false
else u:=true;
if (t>=0)and(u)then print
else if (t>0)and(h<3*n-4 )and(i<=n)and(p[i].c=false) then
begin
for j:=1to n do
if (p[j].c=false)and(i<>j) then
begin
o:=t;
p[j].c:=true;
p[i].c:=true;
e:=p[i].a;
if p[i].a<p[j].a then e:=p[j].a;
o:=t;
t:=t-e;
z:=h;
b[h]:=i;
b[h+1]:=j;
h:=h+2;
back;
{if i+1=n then x:=i+1
else x:=i+1 mod n;}
cross(i+1);
p[j].c:=false;
p[i].c:=false;
t:=o;
h:=z;
end;
end;
end;
begin
r:=false;
readln(n);
readln(m);
for i:=1to n do
begin
readln(p[i].a);
p[i].c:=false;
end;
t:=m;
h:=1;
cross(1);
if r=false then writeln ('mismatch');
end.

但发现运行结果错误
本人小鸟一个 愿请教达人!

不好意思, 你写的太长了,实在看不下来

你不会把代码优化一下呀.