全排列 Pascal

来源:百度知道 编辑:UC知道 时间:2024/06/19 22:08:28
描述 Description
输入两个自然数m,n 1<=n<=20,1<=m<=n!
输出n个数的第m种全排列。
如 :
输入 3 1
输出 1 2 3

输入格式 Input Format
在一行中输入n m

输出格式 Output Format
一个数列,既n个数的第m种排列
每两个数之间空1格

样例输入 Sample Input :
3 2

样例输出 Sample Output :
1 3 2

时间限制 Time Limitation
各个测试点1s

var shu:array [1..30] of boolean;
a,b,c,d,i,j,m,n,no:longint;g:array [0..30] of int64;
begin
read(n,m);m:=m-1;fillchar(shu,sizeof(shu),true);
g[0]:=1;no:=n-1;c:=0;
for i:=1 to n do g[i]:=g[i-1]*i;
for i:=1 to n do begin d:=0;a:=0;
repeat
a:=a+1;if shu[a]=true then d:=d+1;
until d=m div g[no]+1;
write(a,' ');shu[a]:=false;m:=m mod g[no];no:=no-1;end;
end.

1递归生成法,这种方法最好理解。
var m,n,total:integer;
b:array[1..20] of 0..1;//标志数组,表示是否用过这个数
a:array[1..20] of integer;//存放结果
procedure pailie(k:integer);//生成过程
var i:integer;
begin
if k>n then begin//如果生成了一组排列,那么进行处理
inc(total);//计数器+1
if total=m then//如果生成了m组,输出
begin
for i:=1 to n-1 do
write(a[i],' ');
writeln(a[n]);
en