全排列 (codevs 1294)题解

【题目描述】

    给出一个n, 请输出n的所有全排列(按字典序输出)。

【样例输入】

     3

【样例输出】

     1 2 3

    1 3 2

    2 1 3

    2 3 1

    3 1 2

    3 2 1

【解题思路】

     听说C++有作弊器(求全排列的函数),羡慕不已啊……不过pascal也挺简单的,简单的递归回溯,我用了一个集合保证所有数字不重复,不知哪位神犇能给出更好的办法请写在评论处,谢谢!

【代码实现】

var n,w:longint;

    a:array[1..10]of longint;

    b:set of 1..10;//集合存储已用的数字

procedure try(m:longint);

var i:longint;

begin

 if m=n then//一个排列生成,输出

  begin

   for i:=1 to n do

    write(a[i],' ');

   writeln;

  end

 else

  for i:=1 to n do

   if not (i in b) then

    begin

     inc(w);

     a[w]:=i;

     b:=b+[i];//存入a数组,方便输出,并标记

     try(m+1);//递归

     b:=b-[i];

     dec(w);//回溯

    end;

end;

begin

 readln(n);

 try(0);

end.
全排列

 

你可能感兴趣的:(code)