全排列VIJOS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全排列VIJOS相关的知识,希望对你有一定的参考价值。
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
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. 参考技术A 我是出题者LK,你这是传统的搜索,搜索是100%通不过的,想一想别的方法吧,不会可以给我发信息。
以上是关于全排列VIJOS的主要内容,如果未能解决你的问题,请参考以下文章