Witam!
Może ktoś już "przerabiał" następujące zagadnienie:
ze zbioru n-elementowego np. {5,6,2} należy wyznaczyć wszystkie kombinacje jego elementów (w podanym przykładzie jest ich 3!=6, czyli: 5-6-2, 5-2-6, 6-5-2, 6-2-5, 2-5-6, 2-6-5). Tak wyznaczone kombinacje trzeba zapisać w kolejnych wierszach tablicy tak, aby każdy element znalazł się w oddzielnej komórce (w podanym przykładzie będzie to tablica składająca się z 3 kolumn i 6 wierszy). Zbiory mogą zawierać od 3 do 7 elementów.
Będę wdzięczny za wszelkie sugestie.
jacek_ napisał(a)
Witam!
Może ktoś już "przerabiał" następujące zagadnienie:
ze zbioru n-elementowego np. {5,6,2} należy wyznaczyć wszystkie kombinacje jego elementów (w podanym przykładzie jest ich 3!=6, czyli: 5-6-2, 5-2-6, 6-5-2, 6-2-5, 2-5-6, 2-6-5). Tak wyznaczone kombinacje trzeba zapisać w kolejnych wierszach tablicy tak, aby każdy element znalazł się w oddzielnej komórce (w podanym przykładzie będzie to tablica składająca się z 3 kolumn i 6 wierszy). Zbiory mogą zawierać od 3 do 7 elementów.
Będę wdzięczny za wszelkie sugestie.
Tak dokladniej to sa to permutacje tego zbioru.
Przyklad rekurencyjnego rozwiazania:
private int silnia(int n)
{
int ret=1;
for(int i=2;i<=n;i++)
ret*=i;
return ret;
}
private int[][] permutacje(int [] tab)
{
if (tab.Length == 2)
{
int [][]ret = new int[2][];
for(int i=0;i<ret.Length;i++)
ret[i] = new int[2];
for(int i=0;i<2;i++){
ret[i][i]=tab[0];
ret[i][(i+1)%2]=tab[1];
}
return ret;
}
int [][] rest = new int[silnia(tab.Length)][];
int index=0;
for(int i=0;i<rest.Length;i++)
rest[i] = new int[tab.Length];
for(int i=0;i<tab.Length;i++){
int []subtab = new int[tab.Length-1];
int subindex=0;
for(int j=0;j<tab.Length;j++)
if(j!=i) subtab[subindex++]=tab[j];
int [][]reszta= permutacje(subtab);
for(int j=0;j<reszta.Length;j++)
{
rest[index][0]=tab[i];
for(int k=0;k<reszta[j].Length;k++)
rest[index][k+1] = reszta[j][k];
++index;
}
}
return rest;
}
pozdrawiam
johny
dzięki za pomoc
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.