5

これは、たとえばセットのすべての可能な組み合わせを生成するための私の単純なコードです

1,2,3:

  • ディスプレイ:123132213231 312 321

可変数のforループを作成して、ユーザーが指定された文字列の長さを決定できるようにしたい...

誰かがアイデアを持っていますか...

前もって感謝します。

type
  TNumber = '0'..'9';

procedure TForm1.Button1Click(Sender: TObject);
var
  Numbers: array[0..3] of TNumber;
  a, b, c, d: Integer;
  s: string;
begin
  Numbers[0] := '1';
  Numbers[1] := '8';
  Numbers[2] := '7';
  Numbers[3] := '2';
  for a := low(Numbers) to High(Numbers) do
    for b := low(Numbers) to High(Numbers) do
      for c := low(Numbers) to High(Numbers) do
        for d := low(Numbers) to High(Numbers) do
        begin
          s := Numbers[a] + Numbers[b] + Numbers[c]  + Numbers[d];
          if
            (Occurrences('1', s) > 1 ) or
            (Occurrences('8', s) > 1 ) or
            (Occurrences('7', s) > 1 ) or
            (Occurrences('2', s) > 1 )
          then
            Continue
          else
            Memo1.Lines.Add(s);
  end;
end;

function TForm1.Occurrences(const Substring, Text: string): Integer;
var
  Offset: Integer;
begin
  Result := 0;
  Offset := PosEx(Substring, Text, 1);
  while Offset <> 0 do
  begin
    Inc(Result);
    Offset := PosEx(Substring, Text, offset + length(Substring));
  end;
end;

終わり。

4

1 に答える 1

9

これがあなたが望む出力を生成するいくつかのコードです。ニーズに合わせて少し回避する必要がありますが、この再帰的なソリューションで表現されている概念は重要です。

program Permuatations;

{$APPTYPE CONSOLE}

type
  TElements = '1'..'3';

procedure EnumerateCombinations(const Stem: string; Len: Integer);
var
  i: Integer;
  el: TElements;
  Used: set of TElements;
begin
  if Len=0 then
    exit;
  Used := [];
  for i := 1 to Length(Stem) do
    Include(Used, Stem[i]);
  for el := low(el) to high(el) do
  begin
    if el in Used then
      continue;
    if Len=1 then
      Writeln(Stem+el)
    else
      EnumerateCombinations(Stem+el, Len-1)
  end;
end;

procedure Main;
begin
  EnumerateCombinations('', 1+ord(high(TElements))-ord(low(TElements)));
end;

begin
  Main;
  Readln;
end.

出力:

123
132
213
231
312
321

TElementsたとえば、の定義をに変更する'1'..'4'と、24の可能な順列が表示されます。

于 2012-08-26T17:30:23.943 に答える