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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值