回 帖 发 新 帖 刷新版面

主题:[讨论]这个程序要怎么写?

给出一个数n,求出该数的全排列。
譬如:3
有 1 2 3
   1 3 2
   2 1 3
   2 3 1
   3 1 2
   3 2 1

回复列表 (共2个回复)

沙发

如果要解的个数,那么这道题目就是个计算n!的题目,用高精度就好了。
如果是让输出每一种情况,那么这道题目显然复杂度是n!的。
可以简单的按照字典序找到下一个,ABCDE->ABCED->ABDCE(从后向前找到第一个不是递增的,将最后一个字母移动到前面就得到字典序中的下一个。)知道搜索到EDCBA为止。
程序就不写了,网上一搜一大把。

板凳

//真不好意思,只能过小数据,行吗?
program pailie;
var
   a:array[1..20]of boolean;
   b:array[0..20]of integer;
   i,n:integer;
procedure print;
var i:integer;
begin
   for i:=1 to n do write(b[i],' ');
   writeln;
end;

procedure find(p:integer);
var i:integer;
begin
   if p=n then print
          else begin
            for i:=1 to n do if a[i] then begin
              a[i]:=false;
              b[p+1]:=i;
              find(p+1);
              a[i]:=true;
            end;
          end;
end;

begin
   readln(n);
   for i:=1 to n do a[i]:=true;
   for i:=1 to n do begin
     b[1]:=i;
     a[i]:=false;
     find(1);
     a[i]:=true;
   end;
   readln;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册