M
mxq888
Unregistered / Unconfirmed
GUEST, unregistred user!
我收藏的一个函数,返回的TstringList中,列出了p(m,n)所有排列.
用个全局变量为:
DataBuf:array[1..22] of char;
function RangeList(const m,n: Integer): TStringList;
type
TNode = record
d: Integer;
Used: array of Boolean;
end;
var
Stack: array of TNode;
Top: Integer;
i,j: Integer;
s: string;
begin
if m>n then
Exit;
SetLength(stack,m);
for i:=1 to m do
SetLength(stack[i-1].Used,n); //setlength(a,n);a下标应该从0..n-1
ZeroMemory(Stack,sizeof(Stack));
Result:=TStringList.Create;
Top:=0;
Stack[0].d:=-1;
while Top>=0 do
begin
while Stack[Top].d<n-1 do
begin
Inc(Stack[Top].d);
if not Stack[Top].Used[Stack[Top].d] then
if Top=m-1 then
begin
s:='';
for i:=0 to Top do
s:=s+DataBuf[Stack.d];
Result.Append(s)
end
else
begin
Inc(Top);
Stack[Top].d:=-1;
for i:=0 to n-1 do
Stack[Top].Used:=Stack[Top-1].Used;
Stack[Top].Used[Stack[Top-1].d]:=True;//#1
end
end;
Dec(Top);
end
end;
比如p(3,10),如果要求组合中,数字可以重复,应该怎么改啊????[]
就是可以出现111,122,212,这样的排列。
也就是每取一个数字后,再取数字时,仍然可以取上次取的数字。
我看不懂上面的函数,望高手帮忙,多谢![]
用个全局变量为:
DataBuf:array[1..22] of char;
function RangeList(const m,n: Integer): TStringList;
type
TNode = record
d: Integer;
Used: array of Boolean;
end;
var
Stack: array of TNode;
Top: Integer;
i,j: Integer;
s: string;
begin
if m>n then
Exit;
SetLength(stack,m);
for i:=1 to m do
SetLength(stack[i-1].Used,n); //setlength(a,n);a下标应该从0..n-1
ZeroMemory(Stack,sizeof(Stack));
Result:=TStringList.Create;
Top:=0;
Stack[0].d:=-1;
while Top>=0 do
begin
while Stack[Top].d<n-1 do
begin
Inc(Stack[Top].d);
if not Stack[Top].Used[Stack[Top].d] then
if Top=m-1 then
begin
s:='';
for i:=0 to Top do
s:=s+DataBuf[Stack.d];
Result.Append(s)
end
else
begin
Inc(Top);
Stack[Top].d:=-1;
for i:=0 to n-1 do
Stack[Top].Used:=Stack[Top-1].Used;
Stack[Top].Used[Stack[Top-1].d]:=True;//#1
end
end;
Dec(Top);
end
end;
比如p(3,10),如果要求组合中,数字可以重复,应该怎么改啊????[]
就是可以出现111,122,212,这样的排列。
也就是每取一个数字后,再取数字时,仍然可以取上次取的数字。
我看不懂上面的函数,望高手帮忙,多谢![]