比如一个数组(1,2,3),如何实现所有的排列组合,如下所示:
(1)
(2)
(3)
(1,2)
(1,3)
(2,3)
(1,2,3)
Delphi/Pascal code
function TestBit(Value, Index : integer) : Boolean;
asm
BT EAX, EDX
SBB EAX, EAX
AND EAX, 1
end;
procedure TForm1.Button1Click(Sender: TObject);
const
A : array[0..4] of Char = (‘A‘,‘B‘,‘C‘,‘D‘,‘E‘);
var
I, J: Integer;
Temp: string;
begin
for I := 1 to 31 do begin
Temp := ‘‘;
for J := Low(A) to High(A) do
if TestBit(I, J) then Temp := Temp + A[J];
Memo1.Lines.Add(Temp);
end;
end;
说一下一楼算法的思路,以免楼主看不懂(这个算法不是递归算法):
首先,把数组每一个元素用一个二进位表示,例如:
A B C D E
1 1 1 1 1 ---> 于是它最多有11111(二进制)种不重复组合(即31种)(不考虑顺序--按楼主要求)
于是,只要检查从1到31这些数字的二进位哪些是二进制值1,就可以得出组合了。(位值为1的元素选取,位值为0的元素弃之)
函数TestBit是我以前写的一个小函数,用于检查某整型数某二进位值,如果该位为1返回True。这个函数从来没有用到过,用在这里了。
^_^
一个回溯算法的例子:
Delphi/Pascal code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|