标签:
字典序法
对于按字典的顺序给出的排列(p=p(1)p(2)p(3)p(4)…p(n)),由一个排列生成下一个排列的算法如下:
(1)求满足关系式p(j-1)<p(j)的j的最大值设为i,即 i=max{j|p(j-1)<p(j)}
(2)求满足关系式p(i-1)<p(k)的k的最大值设为j,即 j=max{k|p(i-1)<p(k)}
(3)p(i-1)与p(j)互换位置,得到p‘=p(1)p(2)…p(n)
(4)在p‘=p(1)p(2)…p(i-1)p(i)p(i+1)…p(n)中,把p(i)p(i+1)…p(n)部分逆序,所得p=p(1)p(2)…p(i-1)p(n)p(n-1)…p(i)序列就是所求。其中j的意义是排列的下标,对于一个有n个数的排列,j的范围是从0到n。p(j)就是这个排列的第j个数。
附源码:
var
p:array[0..1000]of longint;
i,n,j,k,t:longint;
begin
readln(n);
for i:=1 to n do p[i]:=i;
repeat
for i:=1 to n do write(p[i],‘ ‘); writeln;
for j:=1 to n do if p[j-1]<p[j] then i:=j;
for k:=1 to n do if p[i-1]<p[k] then j:=k;
t:=p[i-1]; p[i-1]:=p[j]; p[j]:=t;
for k:=i to (i+n)shr 1 do
begin
t:=p[k]; p[k]:=p[n-k+i]; p[n-k+i]:=t;
end;
until i=1;
end.
标签:
原文地址:http://www.cnblogs.com/cxvdzxhb/p/4478829.html