华为 huawei matebook:pascal 高手进

来源:百度文库 编辑:高校问答 时间:2024/05/08 04:43:28
球迷购票(work3.pas)
[问题描述]
盛况空前的足球赛即将举行。球赛门票售票处排起了球迷购票长龙。
按售票处规定,每位购票者限购一张门票,且每张票售价为50元。在排成长龙的球迷中有m个人手持面值50元的钱币,另有n个人手持面值100元的钱币。假设售票处在开始售票时没有零钱。试问这m+n个球迷有多少种排队方式可使售票处不致出现找不出钱的尴尬局面。
例如当m=3,n=2时,用A表示手持面值50元钱币的球迷,用B表示手持面值100元钱币的球迷,则最多可得到以下5组不同排队方式,使售票处不致出现找不出钱的尴尬局面。
售票处 A A A B B
售票处 A A B A B
售票处 A B A A B
售票处 A A B B A
售票处 A B A B A

[编程任务]
对于给定的m和n的值( 0  m,n  100),编程计算出m+n个球迷有多少种排队方式可使售票处不致出现找不出钱的尴尬局面。

[数据输入]
输入文件(work3.in)只有一行两个数,分别表示m和n的值,用一个空格隔开。

[数据输出]
输出文件(work3.out)只有一个数。

[输入示例]
3 2

[输出示例]
5

作业4、分油问题(work4.pas)
[问题描述]
设有大小不等的3个无刻度的油桶,分别能够存满,X,Y,Z公升油(例如X=80,Y=50,Z=30)。初始时,第一个油桶盛满油,第二、三个油桶为空。编程寻找一种最少步骤的分油方式,在某一个油桶上分出targ升油(例如targ=40)。若找到解,则将分油方法打印出来;否则打印信息“UNABLE”等字样,表示问题无解。

输入输出:
输入文件(work4.in)一行4个整数,依次表示X,Y,Z,targ,每个数之间用一个空格隔开;
输出文件(work4.out)表示解的情况,如果无解输出UNABLE,如果有解,则输出分油方法(每一步三个油桶的状态),如果解不唯一也只有输出任一个解,如:
输入:80 50 30 40
则输出:
80 0 0
50 0 30
50 30 0
20 30 30
20 50 10
70 0 10
70 10 0
40 10 30
请把第一题的源程序给出来

program l_3(input,output);
var
m,n:integer;
function stack(m,n,k:integer):qword;
begin
if m=0 then
if k=0 then
stack:=0
else
if k<n then stack:=0 else stack:=1
else
if k=0 then
if n=0 then
stack:=1
else
stack:=stack(m-1,n,k+1)
else
if n=0 then
stack:=1
else
stack:=stack(m-1,n,k+1)+stack(m,n-1,k-1);
end;
begin
assign(input,'work3.in');
reset(input);
assign(output,'work3.out');
rewrite(output);
readln(m,n);
if m<n then
writeln('0')
else
writeln(stack(m,n,0));
close(input);
close(output);
end.

program l_4(input,output);
type
node=record
cx,cy,cz:integer;
end;
var
q:array[1..10000] of node;
f,r:integer;
wx,wy,wz,targ,x,y,z:integer;
flag:boolean;
procedure out;
begin
wx:=q[f].cx;
wy:=q[f].cy;
wz:=q[f].cz;
end;
procedure push;
var
k:integer;
flag1:boolean;
begin
flag1:=true;
for k:=1 to r do
if (q[k].cz=wz) and (q[k].cy=wy) and (q[k].cx=wx) then flag1:=false;
if flag1 then
begin
r:=r+1;
q[r].cz:=wz;
q[r].cy:=wy;
q[r].cz:=wz;
end;
end;
procedure cup;
begin
out;
if wz>0 then
begin
if wz+wy>=y then
begin
wz:=wz+wy-y;
wy:=y;
end
else
begin
wy:=wz+wy;
wz:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wz>0 then
begin
if wz+wx>=x then
begin
wz:=wz+wy-x;
wx:=x;
end
else
begin
wx:=wz+wx;
wz:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cz=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wy>0 then
begin
wz:=wz+wy;
wy:=0;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wy>0 then
begin
if wy+wx>=x then
begin
wy:=wy+wx-x;
wx:=x;
end
else
begin
wx:=wx+wy;
wy:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wx>0 then
begin
wz:=wz+wx;
wx:=0;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
out;
if wx>0 then
begin
if wx+wy>=y then
begin
wx:=wx+wy-y;
wx:=0;
end
else
begin
wy:=wy+wx;
wx:=0;
end;
push;
if (q[r].cz=targ) or (q[r].cy=targ) or (q[r].cx=targ) then
begin
flag:=true;
exit;
end;
end;
end;
procedure print;
var
i:integer;
begin
for i:=1 to r do
writeln(q[i].cz:8,q[i].cy:8,q[i].cx:8);
end;
begin
f:=1;
r:=1;
assign(input,'work4.in');
reset(input);
assign(output,'work4.out');
rewrite(output);
readln(x,y,z,targ);
q[1].cz:=z;
q[1].cy:=0;
q[1].cx:=0;
flag:=false;
repeat
cup;
f:=f+1;
until flag or (f>r);
if f>r then
write('UNABLE')
else
print;
close(input);
close(output);
end.

第一道,输出C(n,n+m)-C(n-1,n+m),注意精度问题
第二道是广搜,可以用三维状态〔i,j,k]表示i,j,k公升有出现过没有判重

可以看看黑书上面有讲解

回朔