[圣诞礼物](3+2+2+3+2=12分)
圣诞节到了,圣诞老人打算把一批圣诞礼物装入各种不同颜色的口袋中,然后分发给 小朋友们。现在圣诞老人手中有5个不同礼物和5个不同口袋,圣诞老人的计划是这样的:
(1)先给每个礼物编号,编号分别是1、2、3、4、5;再给5个口袋编号,分别用a[1]、a[2]、a[3]、a[4]、a[5]来表示,其中a[1]的值表示I号口袋中装的礼物的编号。比如,a[3]=5,
表示3号口袋中装的是编号为5的礼物。
(2)任何一个礼物可以装入任何一个口袋中,但每个口袋中有且仅有一个礼物。也就是说,5个礼物刚好装入5个不同的口袋中。
圣诞老人想知道的是这样的礼物装入口袋的方法一?共有多少种,分别怎么装?他想让你编写一个程序来解决这个问题。而且,他怕你不理解他的含义,举了—个例子,假如行 3个不同的礼物和口袋,那么你的程序应该能输出以下结果:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
S=6
上述输出结果中,最后一行表示装袋方法的种数(这里是6种),前面6行是各种不同的装袋方法。比如,第一行表示1、2、3号口袋分别装的礼物编号是1、2、3:而第3行表示的是1、2、3号口袋分别装的礼物编号是2、1、3。
请你完成下列程序:
program test5;
var
a:array[1..5] of integer;
i1,i2,i3,i4,i5,j1,j2,j3,j4,j5,s:integer;
function f(x,y:integer):Boolean;
var
k:integer;
begin
f:=true;
for k:=1 to x do if a[k]=y then f:=false;
end;
procedure print;
var
i:integer;
Begin
For i:=1 to 5 do write(a[i]:3);writeln;
End;
Begin
S:= 0 ;
For i1:=1 to 5 do
Begin
j1:=1;
a[j1]:=i1 a[j1]:=i1___;
for i2:=1 to 5 do
if f(j1,i2) then
begin
j2:=2;a[j2]:=i2;
for i3:=1 to 5 do
if f(j2,i3)then
begin
j3:=3;a[j3]:=i3;
for i4:=1 to 5 do
if f(j3,i4) then
begin
j4:=4;a[j4]:=i4;
for i5:=1 to 5 do
if f(j4,i5)then
begin
j5:=5;
a[j5]:=i5;
print;
inc(s) ;
end;
end;
end;
end;
end;
writeln(‘s=’, s );
end.