国鑫机械制造有限公司:全排列VIJOS

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/28 22:14:30
program p1092;
var n,total:longint;
m:int64;
flag:array[1..30] of boolean;
a:array[1..30] of longint;

procedure dfs(depth:longint);
var i:longint;
begin
if depth>n then begin
inc(total);
if total=m then begin
for i:=1 to n-1 do write(a[i],' ');
writeln(a[n]);
end;
exit;
end;
for i:=1 to n do
if not flag[i] then begin
a[depth]:=i;
flag[i]:=true;
dfs(depth+1);
flag[i]:=false;
end;

end;

begin
read(n,m);
total:=0;
fillchar(flag,sizeof(flag),false);
dfs(1);
end.

谁能帮我优化一下???谢谢了
P1092 www.VIJOS.CN

这是我在VIJOS上做的

program p1092;
var
m,n,i,j,k,u,l,h,s,y:longint;
a,c:array[1..25] of qword;
b,d:array[1..25]of integer;
begin
read(m,n);
h:=0;y:=m;
k:=n-1;u:=1;
a[1]:=1;a[2]:=1;a[3]:=2;
fillchar(b,sizeof(b),0);
for i:=4 to 21 do
a[i]:=(i-1)*a[i-1];
repeat
s:=k div a[y];
k:=k mod a[y];
dec(y);
inc(h);
d[h]:=s;
until h=m;
for i:=1 to m do b[i]:=i;
k:=0;
y:=m;
for i:=1 to m do
begin
inc(k);
c[k]:=b[d[i]+1];
for j:=d[i]+1 to y-1 do b[j]:=b[j+1];
y:=y-1;
end;
for i:=1 to m do
write(c[i],' ');
end.

我是出题者LK,你这是传统的搜索,搜索是100%通不过的,想一想别的方法吧,不会可以给我发信息。