Zamierzam linkować ze sobą kilkadziesiąt stron za pomocą linkowania po "trójkącie", tj strona a -> b -> c -> a (gdzie -> to odnośnik do strony). O ile przy małej ilości stron obliczenie wszystkich kombinacji linków jest proste, przy kilkunastu pojawia się problem. Idea linkowania po trójkącie polega na tym, że gdy strona a linkuje do strony b, to w żadnej innej kombinacji taki link (nie ważne czy a->b czy b->a) nie może wystąpić po raz drugi.
Postanowiłem ugryźć tej problem od strony kombinatoryki - kombinacji bez powtórzeń. Niżej prosty skrypt, który wyświetla takie zbiory trójelementowe (o takie właśnie chodzi) dla tablicy $tab1.
Nie potrafię jednak rozbudować skryptu tak, żeby wykluczyć elementy "niepotrzebne", czyli takie, które zawierają więcej niż jeden powtórzony element. Już tłumaczę najprościej jak się da
123 124 125 134 135 145 234 235 245 345
Są to wszystkie kombinacje bez powtórzeń dla zbioru (1,2,3,4,5), natomiast mi potrzebne są elementy 123, 145 (powtarza się w nich tylko jeden element, jedynka). W każdym innym elemencie są co najmniej dwie liczby występujące w tych zbiorach. Oczywiście wszystko powinno działać dla dowolnej ilości elementów $tab1.
Jedyny pomysł jaki przychodzi mi do głowy to porównywanie każdego elementu z elementami poprzedzającymi go i sprawdzanie (in_array?), czy jego liczby w elementach poprzedzających powtarzają się nie więcej niż jeden raz. Jeżeli tak jest, element zostaje zapisany do jakiejś dodatkowej tablicy. Nie potrafię jednak tego zaimplementować.
<? $tab2 = $tab1; $tab3 = $tab1; for($i=0;$i<$ilosc;$i++) { $j=$i+1; while($j<$ilosc) { $k=$j+1; while($k<$ilosc) { //wypisanie kombinacji $k++; } $j++; } } ?>
Powyżej kod wyświetlający kombinacje bez powtórzeń.
Czy ktoś już rozwiązywał podobny problem albo wie jak to ugryźć? Mam nadzieję, że wytłumaczyłem to wystarczająco zrozumiale. Dziękuję z góry.