Количество возможных комбинаций / матчей команд можно математически описать как Треугольное число .
Например, при наличии 9 команд число матчей равно 36.
Обратите внимание, что это число делится только на 3, когда k или k-1 делится на 3. С 5 командами вы получите 10 возможных игр.Ваша последняя неделя будет иметь только 1 игру, или вы можете структурировать ее по-разному.
Если вы хотите записать комбинации матчей, вы можете перечислить их, повторив количество команд дважды.Вот пример кода Java. Вы можете запустить его в онлайн-компиляторе Java.
public class MyClass {
public static void main(String args[]) {
int TEAMS = 10; //Number of teams
int combos = 0;
for(int i = 1; i <= TEAMS-1; i++){
for(int j = i+1; j <= TEAMS; j++){
System.out.println("Team " + i + " plays Team " + j);
combos ++;
}
}
System.out.println("There is " + combos + " possible matches");
}
}
Нам нужна не просто каждая комбинация из двух команд.Мы хотим посмотреть на комбинации из 3 команд.Математически нам нужна комбинация .
Мы можем переписать наше Треугольное число, когда n выберет k.Наш предыдущий пример выглядит так:
Каждую неделю, которую мы выбираем, играют 3 команды.Общее количество возможных дневных комбинаций - n выберите 3. В нашем примере с 9 командами.
У нас есть 84 возможных дневных комбинации.Многие из этих дней имеют перекрывающиеся игры.Например, если у нас команды 1, 2 и 3 играют один день, то мы не хотим другого дня с командами 1,2 и 4, потому что тогда 1 и 2 играют 2 игры друг против друга.Решением для этого может быть игнорирование дублированных игр.
Я хочу отметить, что идеального решения не существует.Для большинства команд не существует решения, в котором каждый день 3 команды могут играть вместе, которые еще не играли.Например, когда у нас 4 команды, наши игры: 1-2, 1-3, 1-4, 2-3, 2-4, 3-4.Если мы взяли 3 из этих команд в первый день (1-2, 1-3, 2-3), то во второй день мы не получим идеальную комбинацию (1-4, 2-4, 3-4).
Независимо от того, как вы разбили его, вы можете сортировать по лучшим комбинациям, но в итоге у вас будет множество случайных игр.
Я создал код ниже, чтобы посмотретьв любой возможной комбинации дней и распечатывать дни, которые не дублируются.
public class MyClass {
public static void main(String args[]) {
int TEAMS = 9; //Number of teams
//Keep track of each game combination used
boolean gamesPlayed[][] = new boolean[TEAMS+1][TEAMS+1];
int day = 1;
for(int i = 1; i <= TEAMS-2; i++){
for(int j = i+1; j <= TEAMS-1; j++){
for(int k = TEAMS; k >= j+1; k--){
if(!gamesPlayed[i][j] && !gamesPlayed[i][k] && !gamesPlayed[j][k] )
{
System.out.println("Day "+ day++ + " Teams " + i + ", " + j + " & " + k + " Play");
gamesPlayed[i][j] = true;
gamesPlayed[i][k] = true;
gamesPlayed[j][k] = true;
}
}
}
}
System.out.println("\nLeftover games");
for(int i = 1; i <= TEAMS-1; i++){
for(int j = i+1; j <= TEAMS; j++){
if(! gamesPlayed[i][j])
System.out.println(" Team " + i + " plays Team " + j);
}
}
}
}