求P(N,N)组合运算代码.(100分)

  • 主题发起人 主题发起人 MingWord
  • 开始时间 开始时间
M

MingWord

Unregistered / Unconfirmed
GUEST, unregistred user!
求N个字符串在N个位置上不同,用空格分开.
注:字符串长度不一定只有一位,可能有几位.但是长度是N个都一致的.
例:3个2位长的字符串AA BB CC,求出它们所有不同的组合.
AA BB CC
AA CC BB
BB AA CC
BB CC AA
CC AA BB
CC BB AA
请众高手在给出的代码中,写明白思路.因为是组合代码,很容易混乱.谢谢.
 
function Collocate( //全排列
mStrings: TStrings
//做输出用的字符列表
mArrayString: array of string //源字符串
): Boolean
//返回处理是否成功
procedure pCollocate( //全排列子过程
mLeft: array of string
//排列到左边的字符
mRight: array of string //排列到右边的字符
);
var
I, J, L: Integer;
S: string;
vLeft, vRight: array of string;
begin
if Length(mLeft) = 0 then
begin
S := '';
for I := Low(mRight) to High(mRight) do
S := S + ' ' + mRight;
Delete(S, 1, 1);
mStrings.Add(S);
end else
begin
SetLength(vLeft, Length(mLeft) - 1);
SetLength(vRight, Length(mRight) + 1);
for I := Low(mLeft) to High(mLeft) do
begin
for J := Low(mLeft) to I - 1 do vLeft[J] := mLeft[J];
for J := I + 1 to High(mLeft) do vLeft[J - 1] := mLeft[J];
for J := Low(mRight) to High(mRight) do
vRight[J] := mRight[J];
vRight[High(vRight)] := mLeft;
pCollocate(vLeft, vRight);
end;
end;
end;
begin
Result := False;
if not Assigned(mStrings) then Exit;
mStrings.BeginUpdate;
try
mStrings.Clear;
pCollocate(mArrayString, []);
finally
mStrings.EndUpdate;
end;
Result := True;
end
{ Collocate }

procedure TForm1.FormCreate(Sender: TObject);
begin
Collocate(Memo1.Lines, ['AA', 'BB', 'CC'])
end;
 
谢谢zswang,结果是最合我意的,正在理解你的代码.稍后给分.
 
接受答案了.
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
909
DelphiTeacher的专栏
D
D
回复
0
查看
704
DelphiTeacher的专栏
D
后退
顶部