请把程序略加改动,假设 m=4,n=6,定义
char * d[]={"","A","B","C","D","1","2"};
// 这是C++ 的串数组,第一空串不用,C++数组下标总是从0开始,
再运行一遍,不就得到这些串的排列:
a b c d
a b c 1
a b c 2
....
....
c d 1 2
我简单说一下,只需要限定后面的数组的下标下限大于前一个素的当前值就可以了。
for (i[1]=0;i[1]<n;i[1]++)
for (i[2]=i[1];i[2]<n;i[2]++)
...........
for(i[m]=i[m-1];i[m]<n;i[m]++)
for (j=0;j<m;j++)
print trap[i[j]];
就可以了。
boolean Function GetNext(x: Array[1..MaxN] of integer;
m:integer;n:integer)
应为:
Function GetNext(x: Array[1..MaxN] of integer;
m:integer;n:integer):boolean
本人Pascal已有十年未用了, 到了Delphi变化更大了。
boolean Function GetNext(x: Array[1..MaxN] of integer;
m:integer;n:integer)
var i,j,b:integer;
begin { 求排列的下一组,若有返true,否则为假 }
for i:=m downto 1
begin
b:=x[i];
if (b<n-m+i) then {x[i]是否到了极限n-m+i}
begin
for j:=i to m
begin
b:=b+1; x[j]:=b;
end
GetNext:=true;
return; { 退出函数 }
end
end
GetNext:=false;
return; { 全到了极限,该结束了 }
end
另外C++的循环do while(条件)等同Psacal的Repeat until not 条件,
但条件要取not.