用回溯做全排列程序不过 我pascal

来源:百度知道 编辑:UC知道 时间:2024/06/15 01:14:15
program qq;
var f:array[1..10] of boolean;
b:array[1..10] of integer;
i,j,n:integer;
procedure doing(i:integer);
begin
if i=n+1 then begin for j:=1 to n do write(b[j],' '); writeln; exit;end;
for j:=i to n do
if f[j] then begin
b[i]:=j;
f[j]:=false;
doing(i+1);
f[j]:=true;
end;
end;
begin
read(n);
fillchar(f,sizeof(f),true);
doing(1);
end.

问题是只输出一组解

你的i是递增的 循环不是从i开始 那么 完成1 2 3 。。n 后 就没有循环了 比如1 2 3 5 4 中 第四层 是4 到5 而第五层只能5到5 而5用过了 就没有了

要把for 循环改成1 到n

关键问题在于:你的for循环出错了,既然是全排列,那么你每次做都应该
从1---N判断是否用过,而不应该是从I+1--N额。做这种题要细心,一粗心就容易写错变量或者循环量的。

exit的问题吧?