problem - wszystkie kombinacje cyrf z rozlacznych zbiorow

0

mam dosc powazny problem z ktorym nie moge sobie poradzic :/
otoz

mam cztery rozlaczne zbiory:
zbior 1. 1 2 3
zbior 2. 4 5
zbior 3. 6 7 8
zbior 4. 9

i musze teraz wygenerowac takie kombinacje cyferek po jednej z kazdego zbioru wyznaczajac wszystkie takie mozliwosci:

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

wypisujac je recznie nie ma wiekszego problemu ale nie moge sobie poradzic z tym jak to zaimplementowac aby program automatycznie generowal mi te kombinacje

DODAM TYLKO ZE TO TYLKO PRZYKLAD BO ZBIORY ROZLACZNE BEDA SIE ZMIENIAC WIEC POTRZEBUJE SPOSOBU UNIWERSALNEGO

jesli mozecie mi dac jakies wskazowki albo cos w pseudokodzie lub jeszcze lepiej jakis przyklad w Delphi/Pascal

z gory dzieki za kazda pomoc i pozdrawiam
wasyl3k

0

jedziesz pętlami przez wszystkie elementy zbiorów/tablic.

{ ... }
var
  t1, t2, t3 {...} : array of integer;
  kombinacja : integer;
begin
for t1 := 0 to high(tablica1)-1 do
  for t2 := 0 to high(tablica2)-1 do
    for t3 := 0 to high(tablica3)-1 do
      begin
        inc( kombinacja );
        writeln( kombinacja + ': ' + tablica1[t1] + ' ' + tablica2[t2] + ' ' + tablica3[t3] );
      end;
{ ... }
end;
0
hyperhex napisał(a)

jedziesz pętlami przez wszystkie elementy zbiorów/tablic.

{ ... }
var
  t1, t2, t3 {...} : array of integer;
  kombinacja : integer;
begin
for t1 := 0 to high(tablica1)-1 do
  for t2 := 0 to high(tablica2)-1 do
    for t3 := 0 to high(tablica3)-1 do
      begin
        inc( kombinacja );
        writeln( kombinacja + ': ' + tablica1[t1] + ' ' + tablica2[t2] + ' ' + tablica3[t3] );
      end;
{ ... }
end;

ok tylko chodzi o to ze ja nie wiem ile bedzie tych zbiorow bo ich liczba mi sie generuje w programie wiec nie wiem ile bede musial petli zrobic wiec nie moge tego "na sztywno" wypisac
poza tym wszystko wrzucam do jednej zbiorczej tablicy gdzie puste miejsca uzupelniam symbolem "X" i wyglada to tak:

1 2 3 X
4 5 X X
6 7 8 X
9 X X X

0

Jeśli robisz to w D2007 - możesz użyć TList i TListEnumerator

0

uzywam Delphi 7.0 Enterprise

0

dobra Twoje rozwiazanie po drobnych korektach zadzialalo dla tego przykladu tak jak powinno

utworzylem 4 tablice i je z palca uzupelnilem i zadzialalo tak jak chcialem:

t1,t2,t3,t4 : array[0..2] of integer;
i,k,l,j,kombinacja : integer;

begin
kombinacja :=0;
t1[0] := 1;
t1[1] := 2;
t1[2] := 3;
t2[0] := 4;
t2[1] := 5;
t2[2] := 0;
t3[0] := 6;
t3[1] := 7;
t3[2] := 8;
t4[0] := 9;
t4[1] := 0;
t4[2] := 0;

for i := 0 to high(t1) do
begin
if (t1[i] = 0) then break
else begin
for j := 0 to high(t2) do
begin
if (t2[j] = 0) then break
else begin
for k := 0 to high(t3) do
begin
if (t3[k] = 0) then break
else begin
for l := 0 to high(t4) do
begin
if (t4[l] = 0) then break
else begin
inc( kombinacja );
Memo1.Lines.Add( IntToStr(kombinacja) + ': ' + IntToStr(t1[i]) + ' ' + IntToStr(t2[j]) + ' ' + IntToStr(t3[k]) + ' ' + IntToStr(t4[l]));
end;
end;
end;
end;
end;
end;
end;
end;

ale chodzi o to ze ja nie moge tego na pojedynczych tablicach zrobic bo nie wiem ile ich bedzie a raczej dynamicznie kodu nie moge tworzyc

wiec wraca problem jednej zbiorczej tablicy ktora wyglada tak:

1 2 3 0 0 0
4 5 0 0 0 0
6 7 8 0 0 0
9 0 0 0 0 0

czy masz jakis pomysl jak zrobic podobny algorytm dla takiej tablicy ?

0
wasyl3k napisał(a)

DODAM TYLKO ZE TO TYLKO PRZYKLAD BO ZBIORY ROZLACZNE BEDA SIE ZMIENIAC WIEC POTRZEBUJE SPOSOBU UNIWERSALNEGO

Więc użyj tablic dynamicznyh. np stwórz procedurę która dostaje listę zbiorów w zmienej Z typu

  TInt2d= array of array of Integer; 

wowczas Z[i] to zbiór a Z[i][j] to element zbioru. przed wywolaniem procedury trzeba ustawić długość Z (zeleżnie od ilości zbiorów) oraz dlugość każdego zbioru i Z[i]. służy do tego SetLength.
po wczytaniu elementów kolej na wywolanie zasadniczej procedury a tu już prosto: dla każdego zbioru, a właściwie tablicy, jest przesuwający się po nim indeks. jak dojdzie do końca, to zostaje wyzerowany i i zwiększony indekks nastepnego zbioru, i tak dalej aż "przekręci się" indeks ostatniego zbioru co oznacza koniec kombinacji:

procedure WypiszKonbinacje( z: TInt2d );
var
  ix: array of integer;
  i:Integer;
begin
  SetLength( ix, Length(Z) ); //tworzymy  indeksy
  repeat
    for i:=0 to Length(Z)-1 do
      Write( Z[i][ix[i]], ' ' );  //wypisanie kombinacji dla bieżących indeksów
    WriteLn;
    for i:=0 to Length(Z)-1 do
      begin
        Inc( ix[i] );// zwiekszamy indeks
        if ix[i]<Length(Z[i]) then
          Break//jesli sie nie przekrecil to wyskok z petli żeby wypisac kombinacje
        else if i=Length(ix)-1 then
          Exit// przekrecil sie ostattni indeks --> to juz koniec
        else
          ix[i]:=0; //przekrecil sie indeks : wyzeruj i zwieksz indeks kolejnego zbioru
      end;
  until False;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1