设有N 个自然数系列:1,2,... ,n
请编程求所有可能的包含所有系列数的组合.并保存到一个二维数组中.例如 N=5时,共有 N!=5!=5*4*3*2*1=120 种组合,数组则定义为 Arr(120,5):组合"12345"
Arr(1,1)=1 Arr(1,2)=2 Arr(1,3)=3 Arr(1,4)=4 Arr(1,5)=5组合"54321"
Arr(1,1)=5 Arr(1,2)=4 Arr(1,3)=3 Arr(1,4)=2 Arr(1,5)=1以及组合"13254",等等!
请编程求所有可能的包含所有系列数的组合.并保存到一个二维数组中.例如 N=5时,共有 N!=5!=5*4*3*2*1=120 种组合,数组则定义为 Arr(120,5):组合"12345"
Arr(1,1)=1 Arr(1,2)=2 Arr(1,3)=3 Arr(1,4)=4 Arr(1,5)=5组合"54321"
Arr(1,1)=5 Arr(1,2)=4 Arr(1,3)=3 Arr(1,4)=2 Arr(1,5)=1以及组合"13254",等等!
const nn=20;
type row=array [1..20] of integer;
var p: row;
n,i: integer;
num:longint;
procedure wrtperm(n:integer; var s:row);
var i:integer;
begin
for i:=1 to n do write(s[i]:3);
writeln;
end;
procedure perm(n:integer; var p:row; var i:integer);
var j,j1,j2,t,m:integer;
begin
i:=n;
repeat i:=i-1 until (p[i]<p[i+1]) or (i<1);
if i>0 then
begin
j:=i+1;
for t:=i+1 to n do
if p[i]<p[t] then j:=t;
m:=p[i]; p[i]:=p[j]; p[j]:=m;
t:=(n-i) div 2;
for j:=1 to t do
begin
j1:=i+j; j2:=n-j+1;
m:=p[j1]; p[j1]:=p[j2]; p[j2]:=m;
end;
end;
end;
begin {main}
writeln('input N:(<=20)'); readln(n);
num:=1;
for i:=1 to n do p[i]:=i;
i:=1;
while i>0 do
begin
wrtperm(n,p);
perm(n,p,i);
if i>0 then num:=num+1;
end;
writeln('num=',num);
end.
对不起,我只会pascal,这是全排列部分,全部程序没完成
例如,n=6
00000
00001
00010
00011
00100
00101
...
...
...
11111
n=k类推
Dim r() As Integer '用于存放序列表
Dim f() As Boolean '用于标志
Dim i As Integer
Dim p As Integer
ReDim r(n)
ReDim f(n)
i = 1
Do
r(i) = r(i) + 1
If r(i) > n Then
i = i - 1
f(r(i)) = False
ElseIf Not f(r(i)) Then
If i < n Then
f(r(i)) = True
i = i + 1
r(i) = 0
Else
For p = 1 To n
Debug.Print r(p);
Next
Debug.Print
End If
End If
Loop Until i = 0
End Sub