http://expert.csdn.net/Expert/topic/1991/1991952.xml?temp=.5721399
为任意个数字的全排列;
下面列出的7个数字的全排列算法;
这里有些局限性,朋友们可以改一改;
比如数组声明写死了等...
procedure TForm1.pergen(const n: integer);
label l;
var
p,q,r,i,k:integer;
a:array[1..7] of integer;
e,d:array[2..7] of integer;
tempStr:string;
begin
a[1] :=1;
for i := 2 to n do
begin
a[i] := i;
d[i] := i;
e[i] := -1;
end;
l:
q:=0;
tempStr := '';
for i := 1 to n do
begin
tempStr:= tempStr + inttostr(a[i]);
end;
listbox1.Items.Add(tempStr);
for k:= n downto 2 do
begin
d[k] := d[k]+e[k];;
p:=d[k];
if p=k then
e[k]:=-1
else if p=0 then
begin
e[k]:=1;q:=q+1;
end else
begin
p:=p+q; r:=a[p];a[p]:=a[p+1];
a[p+1] := r; goto l
end;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
pergen(7);
end;
这是组合数学的知识
为任意个数字的全排列;
下面列出的7个数字的全排列算法;
这里有些局限性,朋友们可以改一改;
比如数组声明写死了等...
procedure TForm1.pergen(const n: integer);
label l;
var
p,q,r,i,k:integer;
a:array[1..7] of integer;
e,d:array[2..7] of integer;
tempStr:string;
begin
a[1] :=1;
for i := 2 to n do
begin
a[i] := i;
d[i] := i;
e[i] := -1;
end;
l:
q:=0;
tempStr := '';
for i := 1 to n do
begin
tempStr:= tempStr + inttostr(a[i]);
end;
listbox1.Items.Add(tempStr);
for k:= n downto 2 do
begin
d[k] := d[k]+e[k];;
p:=d[k];
if p=k then
e[k]:=-1
else if p=0 then
begin
e[k]:=1;q:=q+1;
end else
begin
p:=p+q; r:=a[p];a[p]:=a[p+1];
a[p+1] := r; goto l
end;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
pergen(7);
end;
这是组合数学的知识
label l;
var
p,q,r,i,k:integer;
a:array of integer;
e,d:array of integer;
tempStr:string;
begin
SetLength(a,n+1);
SetLength(e,n+1);
SetLength(d,n+1);
try
a[1] :=1;
for i := 2 to n do
begin
a[i] := i;
d[i] := i;
e[i] := -1;
end;
l:
q:=0;
tempStr := '';
for i := 1 to n do
begin
tempStr:= tempStr + inttostr(a[i]);
end;
listbox1.Items.Add(tempStr);
for k:= n downto 2 do
begin
d[k] := d[k]+e[k];;
p:=d[k];
if p=k then
e[k]:=-1
else if p=0 then
begin
e[k]:=1;q:=q+1;
end else
begin
p:=p+q; r:=a[p];a[p]:=a[p+1];
a[p+1] := r; goto l
end;
end;
finally
a:=nil;
e:=nil;
d:=nil;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
pergen(7);
end;
你没看到 listbox1.Items.Add(tempStr);吗,那里就是结果的输出;
上面的算是不要求个数,那是个通用算法,你稍微改改就行了;
如果你非要我把代码写全了,请看:
*****************************
procedure TForm1.pergen(a:numArray;const n:integer);
label l;
var
p,q,r,i,k:integer;
//a:array of integer;
e,d:array of integer;
tempStr:string;
begin
SetLength(a,n+1);
SetLength(e,n+1);
SetLength(d,n+1);
try
//a[1] :=1;
for i := 2 to n do
begin
//a[i] := i;
d[i] := i;
e[i] := -1;
end;
l:
q:=0;
tempStr := '';
for i := 1 to n do
begin
tempStr:= tempStr + inttostr(a[i]);
end;
//输出结果
listbox1.Items.Add(tempStr);
for k:= n downto 2 do
begin
d[k] := d[k]+e[k];;
p:=d[k];
if p=k then
e[k]:=-1
else if p=0 then
begin
e[k]:=1;q:=q+1;
end else
begin
p:=p+q; r:=a[p];a[p]:=a[p+1];
a[p+1] := r; goto l
end;
end;
finally
a:=nil;
e:=nil;
d:=nil;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
a:numArray;
i:integer;
begin
listbox1.Clear;
//如果是5个数,随机初始化数组;
setlength(a,5+1);
for i := 1 to 5 do
begin
a[i] := random(9);
end;
//全排列,并输出结果
pergen(a,5);
a := nil;
end;
SetLength(a,n+1);
a:=nil;
注释掉;因为数组已经自外面初始化了,由外面释放了
type
numArray = array of integer;注意:
你要的所有要求都满足了
1、我随机的输入几个数
个数是不定的
取这几个数的
for i := 1 to 5 do
begin
a[i] := random(9);
end;
//以上代码满足随机生成几个数,初始化数组;
//你不会连在10个数中去5个随机的数都不会把;我想你应该会的
//所以,我没有给出多个随机数,然后再在里面抽,我只给出了,
//相当于随即抽取的要求数量的数2、
排列结果
如果数的个数是一定的
那我只用几个嵌套循环不就得了吗//你用几个嵌套是出不来的;不信你试试3、
这些数是未知
是动态输入
//我已经动态的生成随机数了4、用goto问题,如果你用的不好请不要用
并不是说用goto不要,而是很多程序员乱用,导致程序的控制流程无序
相信我,这是最好的,用goto没问题的;
对于P(n,n)
这其实可以看作是8皇后问题的变体
用回溯算法就可以了吧