Algorytm na kombinacje dwójkowe bez powtórzeń

0

Witajcie.

Zastanawiam się nad skryptem generującym tabelę do rozgrywek ligowych.
Założenie jest takie, że dla podanej ilości zawodników skrypt powinien wygenerować wszystkie możliwe kombinacje dwójkowe meczy bez powtórzeń. Mecze są rozgrywane dwóch na dwóch.

Czyli dla czterech graczy $tab = ['A', 'B', 'C', 'D'] mam następujące kombinacje:
AB vs. CD
AC vs. BD
AD vs. BC

Dla pięciu graczy $tab = ['A', 'B', 'C', 'D', 'E'] będzie to:
AB vs. CD
AB vs. CE
AB vs. DE

AC vs. BD
AC vs. BE
AC vs. DE

AD vs. BC
AD vs. BE
AD vs. CE

AE vs. BC
AE vs. BD
AE vs. CD

BC vs. DE
BD vs. CE
BE vs. CD

Wiadomo, im więcej zawodników tym więcej meczy :)
Czy ma ktoś pomysł jak zaimplementować taki algorytm w PHP?

1

Pokaż co już napisałeś, jeżeli nie napisałeś nic - to z czym masz konkretny problem? Bierz kartkę i ołówek i rozpisuj jak ma to działać.

0

Kod na kombinacje tutaj: https://rosettacode.org/wiki/Combinations#PHP
Jak już będziesz miał te kombinacje w jakiejś liście, np:
lst_comb = [('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('B', 'C'), ('B', 'D'), ('B', 'E'), ('C', 'D'), ('C', 'E'), ('D', 'E')]
(To przykład dla pięciu graczy)

To teraz Zdefiniuj sobie funkcje, która zwróci false gdy jedna kombinacja zawiera element drugiej, np.: fun_comp(('A', 'B'), ('B', 'C')) # -> false .Ale:
fun_comp(('A', 'B'), ('C', 'E')) # -> true
W pseudokodzie:

fun fun_comp(a, b):
    for x in a:
        if x in b:
            return False
    return True

Teraz wystarczy zrobić pętlę:

for i from 0 to length(lst_comb):
    for k from i + 1 to length(lst_comb):
        if fun_comp(lst_comb[k], lst_comb[i]):
            print(lst_comb[i], lst_comb[k])

I pozamiatane:):

('A', 'B') ('C', 'D')
('A', 'B') ('C', 'E')
('A', 'B') ('D', 'E')
('A', 'C') ('B', 'D')
('A', 'C') ('B', 'E')
('A', 'C') ('D', 'E')
('A', 'D') ('B', 'C')
('A', 'D') ('B', 'E')
('A', 'D') ('C', 'E')
('A', 'E') ('B', 'C')
('A', 'E') ('B', 'D')
('A', 'E') ('C', 'D')
('B', 'C') ('D', 'E')
('B', 'D') ('C', 'E')
('B', 'E') ('C', 'D')

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