Все возможности массива - PullRequest
0 голосов
/ 17 января 2010

У меня есть код на паскале (язык программирования на самом деле ничего не значит):

поле [1]: = 14;
поле [2]: = 2;
поле [3]: = 4;
поле [4]: ​​= 5;
поле [5]: = 6;
поле [6]: = 8;

Я хочу получить все возможности. Например, box [1] = box [6], затем box [6] = box [1]. Да, я могу написать это своими руками, но я думаю, что могу сделать это более умным, с помощью цикла. Есть предложения?

Ответы [ 3 ]

2 голосов
/ 17 января 2010

Я взял первый алгоритм перестановки, который нашел в википедии, и реализовал его в Delphi (2009); Я надеюсь, что это то, что вы ищете:

type
  TIntegerArray = array of Integer;

procedure Permutation(K: Integer; var A: TIntegerArray);
var
  I, J: Integer;
  Tmp: Integer;

begin
  for I:= 2 to Length(A) do begin
    J:= K mod I;
    Tmp:= A[J];
    A[J]:= A[I - 1];
    A[I - 1]:= Tmp;
    K:= K div I;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  K, I: Integer;
  A: TIntegerArray;
  S: string;

begin
  Memo1.Lines.Clear;
  for K:= 0 to 719 do begin
    A:= TIntegerArray.Create(14, 2, 4, 5, 6, 8);
    Permutation(K, A);
    S:= '';
    for I:= 0 to Length(A) - 1 do
      S:= S + Format('%3.d ', [A[I]]);
    Memo1.Lines.Add(S);
  end;
end;
0 голосов
/ 18 января 2010

Таким образом, в основном, у вас есть набор предметов, которые могут быть включены (1) или исключены (0).Если считать от 0 до 2 ^ (количество элементов) -1, каждое целое число будет набором битов, указывающих, какие элементы включены.

Если у вас есть 7 элементов, в цикле от 0 до 127выбраны следующие предметы:

x0000000 (loop variable = 0, no items are chosen)
x0000001 (loop variable = 1, item [1] is chosen)
x0000010 (loop variable = 2, item [2] is chosen)
x0000011 (loop variable = 3, items [1] and [2] are chosen)
...
x1111111 (loop variable = 127, items [1], [2], [3], [4], [5], [6], [7] are chosen)
0 голосов
/ 17 января 2010
...