PASCAL编程:有N个皮球,给他们编号。有几种方法排列

来源:百度知道 编辑:UC知道 时间:2024/05/30 20:43:00
如输入:N=3,输出:1 2 3,1 3 2,2 3 1,2 1 3,3 1 2 ,total=6。
(要求:尽量优化)

{1.输入正整数n,输出1,2,……,n的 (n<=8)。
(提示:输出全排列是一经典搜索问题,关键在于,元素不能重复出现。所以用一个标志数组flag记录
每个元素是否出现过,初始值假定都没有出现过,即赋初值false,每确定一个数字,就把这个数字
的flag值设为true,特别需要注意的是,回溯的时候需要把flag重新设为false。)}
program e;
var
n,t:longint;
a:array[1..8] of integer;
flag:array[1..8] of boolean;

procedure search(depth:integer); {depth变量表示正在搜索第几个元素}
var
i:integer;
begin
if(depth>n) then {depth>n表明已经搜索到了第n个数,那么输出结果}
begin
for i:=1 to n do write(a[i]:4);
writeln;
inc(t);
exit; {此种结果输出后,退出该层搜索}
end;
for i:=1 to n do {枚举下一个出现的元素}
if flag[i]=false then {判断是否已经出现过}
begin
a[depth]:=i; {没有出现,则把第depth个数设为i}
flag[i]:=true; {给这个标志变量给出出现的标志}
search(depth+1); {递归搜索下一个元素}
flag[i]:=false; {回溯,此时恢复这个标志变量为没出现的标志}
end;
end;

begin
writ