全排列 (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.
全排列

 

你可能感兴趣的:(全排列 (codevs 1294)题解)