码迷,mamicode.com
首页 > 编程语言 > 详细

如何实现一个数组所有的组合????

时间:2015-03-12 06:21:40      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

比如一个数组(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
procedure TForm1.Calc(M : array of Integer);
var
  N : Integer;
  A : array of Integer;
  i , p: Integer;
  X : Integer;
  S : String;
begin
  N := Length(M);
  SetLength(A, N);
  for X := 0 to N - 1 do
  begin
    for i := 0 to N - 1 do A[i] := -1;
    p := 0;
    while p >= 0 do
    begin
      if A[p] = -1 then
      begin
        if p = 0 then
          A[p] := 0
        else
          A[p] := A[p - 1] + 1;
      end
      else
        inc(A[p]);
      if A[p] >= N then
      begin
        A[p] := -1;
        dec(p);
      end
      else begin
        inc (p);
        if p > X then
        begin
          S := ‘‘;
          for i := 0 to do
          begin
            if s <> ‘‘ then s := S + ‘,‘;
            S := S + IntToStr(M[A[i]]);
          end;
          memo1.Lines.Add(S);
          dec(p);
        end;
      end;
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  M : array [0..3of Integer = (1234);
begin
  Calc(M);
end;

如何实现一个数组所有的组合????

标签:

原文地址:http://www.cnblogs.com/phoenixfooldante/p/4331410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!