Entwickler-Ecke

Sonstiges (Delphi) - 1bis 16 alle Möglichkeit finden


downdapp - Fr 18.10.02 18:07
Titel: 1bis 16 alle Möglichkeit finden
Habe 16Variablen a1..a16.

für jede Variable ist 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 als zahl möglich.

Wie kann ich alle Möglichen Verteilung rauskriegen ohne das eine Zahl 2 mal

vorkommt?


Ich meine

die erste Möglickeit wäre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

die zweite

1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 15

die dritte

1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 14 oder ähnlich

__________________________________

so was wie hier will ich aber nicht

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3
usw.

es sind 2.09*10^13 Möglichkeit

ps. ich suche nicht die Anzahl, sondern jede einzelne KOmbination :shock:


Christian S. - Fr 18.10.02 19:00

Hi!

Mit folgendem Code sollte es gehen. Funktioniert per Rekursion. Es werden zwei Arrays verwendet. In "fest" wird die Zahlenfolge gespeichert, die schon fest ist und in "vorrat" alle die Zahlen, die noch permutiert werden müssen. Ist in "vorrat" nur noch eine Zahl, kann "fest" + "vorrat" geschrieben werden.

Er gibt es noch in Datei aus, aber das kannst Du ja abwandeln, wie Du willst!



Quelltext
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:
55:
56:
57:
58:
var
  Form1: TForm1;
  ergebnis : Textfile;

implementation

{$R *.dfm}

procedure perm (fest, vorrat : ARRAY OF Integer);
VAR i,k : INTEGER;
    temp : STRING;
    neu_fest : ARRAY OF Integer;
    neu_vorrat : ARRAY OF Integer;
begin
  if Length(vorrat)=1 THEN
  begin
    temp:='';
    for i:=0 TO High(fest) DO temp:=temp+IntToStr(fest[i])+' ';
    temp:=temp+IntToStr(vorrat[0]);
    Writeln(ergebnis,temp);
  end else
  begin

    SetLength(neu_fest,Length(fest));
    for i:=0 TO High(fest) DO neu_fest[i]:=fest[i];

    SetLength(neu_fest,Length(neu_fest)+1);

    for i:=0 TO High(vorrat) DO
    begin
      neu_fest[High(neu_fest)]:=vorrat[i];

      SetLength(neu_vorrat,Length(vorrat)-1);
      FOR k:=0 TO i-1 DO neu_vorrat[k]:=vorrat[k];
      FOR k:=i+1 TO High(vorrat) DO neu_vorrat[k-1]:=vorrat[k];

      perm(neu_fest,neu_vorrat);
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
const anzahl = 4;
VAR i : INTEGER;
    leer : ARRAY OF Integer;
    zahlen : ARRAY OF Integer;
begin
  AssignFile(ergebnis,'c:\ausgabe.txt');
  ReWrite(ergebnis);
  SetLength(zahlen,anzahl);
  SetLength(leer,0);
  for i:=0 TO anzahl-1 DO zahlen[i]:=i+1;
  perm(leer,zahlen);
  ShowMessage('Fertig!');
  CloseFile(ergebnis);
end;


MfG,
Peter

P.S: Anzahl muss bei Dir dann 16 sein.